189 lines
6.1 KiB
JavaScript
189 lines
6.1 KiB
JavaScript
/** @odoo-module */
|
|
|
|
import { AutoComplete } from "@web/core/autocomplete/autocomplete";
|
|
import { loadJS } from "@web/core/assets";
|
|
const { Component, useRef } = owl;
|
|
import {session} from "@web/session";
|
|
import { useService } from "@web/core/utils/hooks";
|
|
//todo: ztree 继承 import { AutoComplete } from "@web/core/autocomplete/autocomplete";
|
|
//field ztree 继承 fieldm2o,优化 xml 并入 Many2XAutocomplete
|
|
export class Ztree extends AutoComplete {
|
|
setup() {
|
|
super.setup();
|
|
let self = this;
|
|
let setting = self.props.setting;
|
|
let data = self.props.data;
|
|
this.rpc = useService("rpc");
|
|
this.orm = useService("orm");
|
|
this.ztree_root = useRef("ztree_root");
|
|
this.$Ztree = false;
|
|
this.zNodes = false;
|
|
let ztree_Max = 1000;
|
|
this.setting = {
|
|
view: {
|
|
selectedMulti: true,
|
|
fontCss: function getFont(treeId, node) {
|
|
return node.font ? node.font : {};
|
|
},
|
|
nameIsHTML: true,
|
|
showIcon: false,
|
|
txtSelectedEnable: true,
|
|
},
|
|
data: {
|
|
key: {
|
|
title: "title"
|
|
},
|
|
simpleData: {
|
|
enable: true,
|
|
}
|
|
}
|
|
};
|
|
|
|
if (setting)
|
|
$.extend(this.setting, setting);
|
|
|
|
//如果有定义zNodes,则直接按 zNodes数据展现,否则 rpc 取
|
|
|
|
if (data && data.zNodes && data.zNodes.length)
|
|
this.zNodes = data.zNodes;
|
|
this.ztree_field = data.ztree_field;
|
|
this.ztree_model = data.ztree_model;
|
|
this.ztree_parent_key = data.ztree_parent_key;
|
|
//todo: root_id,这个是节点的根id,用 parent_left < x < parent_right 实现,在 domain 增加值
|
|
this.ztree_root_id = data.ztree_root_id;
|
|
this.ztree_domain = data.ztree_domain;
|
|
this.ztree_context = data.ztree_context ? data.ztree_context : session.user_context;
|
|
this.order = data.order;
|
|
this.ztree_selected_id = Number(data.ztree_selected_id);
|
|
this.ztree_selected_vals = [];
|
|
this.ztree_with_sub_node = data.ztree_with_sub_node;
|
|
this.ztree_index = data.ztree_index;
|
|
this.ztree_add_show_all = data.ztree_add_show_all;
|
|
//默认2级
|
|
this.ztree_expend_level = data.ztree_expend_level ? data.ztree_expend_level : 2;
|
|
this.ztree_name_field = data.ztree_name_field;
|
|
this.limit = data.limit > 0 ? data.limit : ztree_Max;
|
|
this.ztree_id = 'ztree-' + this.guid();
|
|
this.ztree_type = data.ztree_type ? data.ztree_type : 'select';
|
|
|
|
//点击外部关闭ztree
|
|
$(document).delegate('body', 'click', function (ev) {
|
|
var $parent = $(ev.target).parents('.dropdown')
|
|
if (!$parent.length && self.zNodes) {
|
|
self.close()}
|
|
});
|
|
}
|
|
|
|
loadSources(useInput) {
|
|
let self = this;
|
|
this.sources = [];
|
|
this.state.activeSourceOption = null;
|
|
const proms = [];
|
|
let request = useInput ? this.inputRef.el.value.trim() : ""
|
|
for (const pSource of this.props.sources) {
|
|
const source = this.makeSource(pSource);
|
|
this.sources.push(source);
|
|
const options = this.loadOptions(
|
|
pSource.options,
|
|
useInput ? this.inputRef.el.value.trim() : ""
|
|
);
|
|
if (options instanceof Promise) {
|
|
source.isLoading = true;
|
|
const prom = options.then((options) => {
|
|
source.options = options.map((option) => this.makeOption(option));
|
|
source.isLoading = false;
|
|
this.state.optionsRev++;
|
|
this.zNodes = options;
|
|
this.state.open = true;
|
|
});
|
|
proms.push(prom);
|
|
}
|
|
}
|
|
|
|
Promise.all(proms).then(() => {
|
|
self.navigate(0);
|
|
var $el = $('#' + self.ztree_id);
|
|
if ($el) {
|
|
self.$Ztree = $.fn.zTree.init($el, self.setting, self.zNodes);
|
|
let ztree_selected_id = this.inputRef.el.getAttribute('data-ztree_selected_id');
|
|
if (!request && ztree_selected_id != undefined && ztree_selected_id > 0) {
|
|
var node = self.$Ztree.getNodeByParam('id', ztree_selected_id, null);
|
|
if (node)
|
|
self.$Ztree.selectNode(node);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
makeOption(option) {
|
|
let res = {};
|
|
if (!option.action)
|
|
option = {label: option.name, value: option.id};
|
|
else
|
|
option = {
|
|
label: option.label,
|
|
value: option.id,
|
|
action: option.action
|
|
}
|
|
res = Object.assign(Object.create(option), {
|
|
id: ++this.nextOptionId,
|
|
});
|
|
return res;
|
|
}
|
|
|
|
close() {
|
|
super.close();
|
|
if (this.zNodes) {
|
|
$.fn.zTree.destroy(this.ztree_id);
|
|
this.$Ztree = undefined;
|
|
this.zNodes = false;
|
|
}
|
|
}
|
|
|
|
onInputBlur() {
|
|
const value = this.inputRef.el.value;
|
|
if (
|
|
this.props.autoSelect &&
|
|
value.length > 0
|
|
) {
|
|
;
|
|
} else {
|
|
this.props.onBlur({
|
|
inputValue: value,
|
|
});
|
|
this.close();
|
|
}
|
|
}
|
|
|
|
guid() {
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
return v.toString(16);
|
|
});
|
|
}
|
|
|
|
getChildNodes(treeNode) {
|
|
var childNodes = this.$Ztree.transformToArray(treeNode);
|
|
var nodes = new Array();
|
|
var i;
|
|
for (i = 0; i < childNodes.length; i++) {
|
|
nodes[i] = childNodes[i].id;
|
|
}
|
|
|
|
return nodes.join(",");
|
|
}
|
|
}
|
|
|
|
Ztree.template = "App.Ztree";
|
|
|
|
Ztree.props = {
|
|
...AutoComplete.props,
|
|
setting: {type: Object, optional: true},
|
|
data: {type: Object, optional: true},
|
|
};
|
|
|
|
Ztree.defaultProps = {
|
|
...AutoComplete.defaultProps,
|
|
};
|
|
|