ljm 修改备份

This commit is contained in:
李鹏宇
2024-12-27 19:45:18 +08:00
parent 9c3118ebd8
commit 72140f9130
5 changed files with 161 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
+20
View File
@@ -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>