ljm 修改备份
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': 'Menu Many2many Checkboxes',
|
||||
'summary': 'Menu Many2many Checkboxes',
|
||||
'description': 'Menu Many2many Checkboxes',
|
||||
'author': 'CY',
|
||||
'website': '',
|
||||
'category': 'Tools',
|
||||
'version': '17.0',
|
||||
'depends': ['base'],
|
||||
'data': [
|
||||
'views/res_users_views.xml',
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'/menu_many2many_checkboxes/static/src/**/*',
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
/** @odoo-module **/
|
||||
import { registry } from "@web/core/registry";
|
||||
import { useSpecialData } from "@web/views/fields/relational_utils";
|
||||
import { Many2ManyCheckboxesField, many2ManyCheckboxesField } from "@web/views/fields/many2many_checkboxes/many2many_checkboxes_field";
|
||||
|
||||
export class MenuMany2ManyCheckboxesField extends Many2ManyCheckboxesField {
|
||||
static template = "menu_many2many_checkboxes.Many2ManyCheckboxesField";
|
||||
setup() {
|
||||
super.setup();
|
||||
this.specialData = useSpecialData((orm, props) => {
|
||||
const { relation } = props.record.fields[props.name];
|
||||
const kwargs = {
|
||||
specification: {
|
||||
id: {},
|
||||
name: {},
|
||||
parent_id: {},
|
||||
},
|
||||
domain: [],
|
||||
limit: 10000,
|
||||
};
|
||||
return orm.call(relation, "web_search_read", [], kwargs);
|
||||
});
|
||||
}
|
||||
|
||||
get items() {
|
||||
function buildTree(data) {
|
||||
// 创建一个 map,用于快速查找节点
|
||||
const nodeMap = new Map();
|
||||
// 初始化节点
|
||||
data.forEach(item => {
|
||||
nodeMap.set(item.id, { ...item, children: [] });
|
||||
});
|
||||
// 构建树
|
||||
const tree = [];
|
||||
data.forEach(item => {
|
||||
const node = nodeMap.get(item.id);
|
||||
if (item.parent_id) {
|
||||
// 如果有 parent_id,将当前节点挂到父节点的 children 下
|
||||
const parentNode = nodeMap.get(item.parent_id);
|
||||
if (parentNode) {
|
||||
parentNode.children.push(node);
|
||||
}
|
||||
} else {
|
||||
// 如果没有 parent_id,说明是根节点,直接加入树
|
||||
tree.push(node);
|
||||
}
|
||||
});
|
||||
|
||||
return tree;
|
||||
}
|
||||
if (this.specialData.data?.records) {
|
||||
return buildTree(this.specialData.data.records);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
updateTreeSelection(resId, checked, tree) {
|
||||
for (let node of tree) {
|
||||
if (node.id === resId) {
|
||||
// 同步点击子节点
|
||||
if (node.children && node.children.length > 0) {
|
||||
node.children.forEach(child => {
|
||||
this.onChange(child.id, checked)
|
||||
});
|
||||
}
|
||||
}
|
||||
// 如果当前节点有子节点,递归更新子节点
|
||||
if (node.children && node.children.length > 0) {
|
||||
this.updateTreeSelection(resId, checked, node.children);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onChange(resId, checked) {
|
||||
// 在 onChange 方法中更新选中状态
|
||||
this.updateTreeSelection(resId, checked, this.items);
|
||||
return super.onChange(resId, checked);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export const menuMany2ManyCheckboxesField = {
|
||||
...many2ManyCheckboxesField,
|
||||
component: MenuMany2ManyCheckboxesField,
|
||||
}
|
||||
|
||||
registry.category("fields").add("menu_many2many_checkboxes", menuMany2ManyCheckboxesField);
|
||||
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="menu_many2many_checkboxes.Many2ManyCheckboxesField">
|
||||
<div aria-atomic="true">
|
||||
<!-- 递归树节点 -->
|
||||
<t t-call="menu_many2many_checkboxes.renderTree">
|
||||
<t t-set="treeData" t-value="items"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-name="menu_many2many_checkboxes.renderTree">
|
||||
<ul>
|
||||
<t t-foreach="treeData" t-as="node" t-key="node.id">
|
||||
<div>
|
||||
<t t-set="Selected" t-value="isSelected([node.id, node.name])"/>
|
||||
<CheckBox
|
||||
value="Selected"
|
||||
disabled="props.readonly"
|
||||
onChange="(ev) => this.onChange(node.id, ev)"
|
||||
>
|
||||
<t t-esc="node.name" />
|
||||
</CheckBox>
|
||||
<!-- 如果有子节点,递归调用自身 -->
|
||||
<t t-if="node.children and node.children.length > 0 and Selected">
|
||||
<t t-call="menu_many2many_checkboxes.renderTree" >
|
||||
<t t-set="treeData" t-value="node.children or []"/>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</ul>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="view_groups_form_inherit_add_widget" model="ir.ui.view">
|
||||
<field name="name">res.groups.inherit</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="inherit_id" ref="base.view_groups_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='menu_access']" position="replace">
|
||||
<field name="menu_access" widget="menu_many2many_checkboxes"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user