Merge pull request !10487 from 李鹏宇/dev
This commit is contained in:
@@ -120,6 +120,7 @@
|
||||
'web.assets_backend': [
|
||||
'yuthon_property_approval/static/src/scss/approval.scss',
|
||||
'yuthon_property_approval/static/xml/misc.xml',
|
||||
'yuthon_property_approval/static/src/js/contract_m2m_tags.js',
|
||||
],
|
||||
},
|
||||
'demo': [],
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { registry } from "@web/core/registry";
|
||||
import {
|
||||
Many2ManyTagsField,
|
||||
many2ManyTagsField,
|
||||
} from "@web/views/fields/many2many_tags/many2many_tags_field";
|
||||
import { Many2XAutocomplete } from "@web/views/fields/relational_utils";
|
||||
|
||||
/**
|
||||
* 自定义的 Many2X 自动完成组件:
|
||||
* - 下拉候选使用 property.lease.contract 的 contract_code + lessor_id
|
||||
*/
|
||||
class ContractMany2XAutocomplete extends Many2XAutocomplete {
|
||||
/**
|
||||
* 重写搜索逻辑:不用 name_search,而是 search_read 读合同编号和出租方
|
||||
*/
|
||||
search(name) {
|
||||
const baseDomain = this.props.getDomain ? this.props.getDomain() : [];
|
||||
const domain = [...(baseDomain || [])];
|
||||
if (name) {
|
||||
domain.push(["contract_code", "ilike", name]);
|
||||
}
|
||||
// 返回 ORM 的原始 Promise(带 abort 方法),以兼容父类 loadOptionsSource
|
||||
return this.orm.searchRead(
|
||||
"property.lease.contract",
|
||||
domain,
|
||||
["contract_code", "lessor_id"],
|
||||
{ limit: this.props.searchLimit + 1 }
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 把 search 返回的记录转换成下拉选项
|
||||
*/
|
||||
mapRecordToOption(rec) {
|
||||
const base = rec.contract_code || "";
|
||||
const lessor = rec.lessor_id && rec.lessor_id[1] ? rec.lessor_id[1] : "";
|
||||
const label = lessor ? `${base}(${lessor})` : base || "";
|
||||
return {
|
||||
value: rec.id,
|
||||
label: label,
|
||||
displayName: label,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义 Many2ManyTags 字段:
|
||||
* - 已选标签显示为 合同编号(出租方)
|
||||
* - 下拉使用上面的 ContractMany2XAutocomplete
|
||||
*/
|
||||
export class ContractMany2ManyTags extends Many2ManyTagsField {
|
||||
// 替换内部使用的自动完成组件
|
||||
static components = {
|
||||
...Many2ManyTagsField.components,
|
||||
Many2XAutocomplete: ContractMany2XAutocomplete,
|
||||
};
|
||||
|
||||
/**
|
||||
* 控制标签上的显示文本
|
||||
*/
|
||||
getTagProps(record) {
|
||||
const props = super.getTagProps(record);
|
||||
const base = record.data.contract_code || record.data.display_name || "";
|
||||
const lessor =
|
||||
record.data.lessor_id && record.data.lessor_id[1]
|
||||
? record.data.lessor_id[1]
|
||||
: "";
|
||||
const label = lessor ? `${base}(${lessor})` : base;
|
||||
return {
|
||||
...props,
|
||||
text: label,
|
||||
title: label,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 字段注册配置:
|
||||
* - 复用原 many2many_tags 的配置
|
||||
* - 额外声明需要加载 contract_code 和 lessor_id 这两个字段
|
||||
*/
|
||||
export const contractMany2ManyTagsField = {
|
||||
...many2ManyTagsField,
|
||||
component: ContractMany2ManyTags,
|
||||
relatedFields: (env) => {
|
||||
const fields = many2ManyTagsField.relatedFields(env) || [];
|
||||
const names = new Set(fields.map((f) => f.name));
|
||||
if (!names.has("contract_code")) {
|
||||
fields.push({ name: "contract_code", type: "char" });
|
||||
}
|
||||
if (!names.has("lessor_id")) {
|
||||
fields.push({ name: "lessor_id", type: "many2one" });
|
||||
}
|
||||
return fields;
|
||||
},
|
||||
};
|
||||
|
||||
// 注册成一个新的字段类型:contract_m2m_tags
|
||||
registry.category("fields").add("contract_m2m_tags", contractMany2ManyTagsField);
|
||||
@@ -12,7 +12,7 @@
|
||||
<field name="available_contract_ids" widget="many2many_tags"/>
|
||||
<field name="your_own_unit" invisible="1"/>
|
||||
<field name="property_ids" widget="many2many_tags" options="{'no_create': True}"/>
|
||||
<field name="contract_ids" widget="many2many_tags" domain="[('is_split', '=', False), ('id', 'not in', available_contract_ids)]" options="{'no_create': True}" context="{'show_lessor_in_contract_name': True}"/>
|
||||
<field name="contract_ids" widget="contract_m2m_tags" domain="[('is_split', '=', False), ('id', 'not in', available_contract_ids)]" options="{'no_create': True}"/>
|
||||
|
||||
</group>
|
||||
</sheet>
|
||||
|
||||
Reference in New Issue
Block a user