From 17a24020acb2d492bb09a3a758c9ee3fd1f765a2 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Thu, 2 Mar 2023 09:35:57 +0000 Subject: [PATCH] [REF] *: do not use activeFields in Field components This commit is to replace all uses of activeFields in Field components by passing fieldInfos to extractProps. We will therefore retrieve the node-dependent information in the extractProps function. Why? This ensures that the info used is that of the correct node. Because the activeFields function contains the information from the last node that referred to the same field. Example: For the first field: FieldInfo.context = {} activeField.context = {'b':"yop"} For the second field: FieldInfo.context = {'b':"yop"} activeField.context = {'b':"yop"} Part of task: 3179751 closes odoo/odoo#113874 Related: odoo/enterprise#37621 Signed-off-by: Aaron Bohy (aab) --- .../views/fields/assign_user_command_hook.js | 5 +- .../many2many_avatar_user_field.js | 23 +++++- .../many2one_avatar_user_field.js | 25 +++--- .../many2one_avatar_user_field.xml | 1 - .../project_state_selection.js | 11 +-- .../project_task_priority_switch_field.js | 35 ++++----- .../purchase_order_alternatives_widget.js | 8 +- .../fields/boolean_icon/boolean_icon_field.js | 8 +- .../boolean_icon/boolean_icon_field.xml | 2 +- .../fields/color_picker/color_picker_field.js | 10 +-- .../color_picker/color_picker_field.xml | 2 +- .../many2many_tags/many2many_tags_field.js | 6 +- .../many2many_tags_avatar_field.js | 23 +++++- .../many2many_tags_avatar_field.xml | 2 +- .../many2one_avatar/many2one_avatar_field.js | 7 ++ .../many2one_avatar/many2one_avatar_field.xml | 2 +- .../views/fields/priority/priority_field.js | 24 ++++-- .../src/views/fields/radio/radio_field.js | 7 +- .../src/views/fields/radio/radio_field.xml | 2 +- .../views/fields/stat_info/stat_info_field.js | 6 +- .../state_selection/state_selection_field.js | 38 +++++----- .../views/fields/statusbar/statusbar_field.js | 6 +- .../src/views/fields/x2many/x2many_field.js | 76 ++++++++++++------- .../src/views/fields/x2many/x2many_field.xml | 6 +- 24 files changed, 199 insertions(+), 136 deletions(-) diff --git a/addons/mail/static/src/views/fields/assign_user_command_hook.js b/addons/mail/static/src/views/fields/assign_user_command_hook.js index 6e8a97fac0c..a6e2f5d5b3c 100644 --- a/addons/mail/static/src/views/fields/assign_user_command_hook.js +++ b/addons/mail/static/src/views/fields/assign_user_command_hook.js @@ -16,10 +16,7 @@ export function useAssignUserCommand() { const orm = useService("orm"); const user = useService("user"); const type = component.props.record.fields[component.props.name].type; - if ( - component.relation !== "res.users" || - component.props.record.activeFields[component.props.name].viewType !== "form" - ) { + if (component.relation !== "res.users") { return; } diff --git a/addons/mail/static/src/views/fields/many2many_avatar_user_field/many2many_avatar_user_field.js b/addons/mail/static/src/views/fields/many2many_avatar_user_field/many2many_avatar_user_field.js index ae6ef298c4a..cbd88dd5211 100644 --- a/addons/mail/static/src/views/fields/many2many_avatar_user_field/many2many_avatar_user_field.js +++ b/addons/mail/static/src/views/fields/many2many_avatar_user_field/many2many_avatar_user_field.js @@ -18,7 +18,9 @@ export class Many2ManyTagsAvatarUserField extends Many2ManyTagsAvatarField { setup() { super.setup(); this.openChat = useOpenChat(this.relation); - useAssignUserCommand(); + if (this.props.withCommand) { + useAssignUserCommand(); + } } get tags() { @@ -44,15 +46,24 @@ export const many2ManyTagsAvatarUserField = { registry.category("fields").add("many2many_avatar_user", many2ManyTagsAvatarUserField); export class KanbanMany2ManyTagsAvatarUserField extends ListKanbanMany2ManyTagsAvatarField { + static props = { + ...ListKanbanMany2ManyTagsAvatarField.props, + displayText: { type: Boolean, optional: true }, + }; + setup() { super.setup(); this.openChat = useOpenChat(this.relation); - useAssignUserCommand(); + if (this.props.withCommand) { + useAssignUserCommand(); + } } get displayText() { - const isList = this.props.record.activeFields[this.props.name].viewType === "list"; - return (isList && this.props.value.records.length === 1) || !this.props.readonly; + return ( + (this.props.displayText && this.props.value.records.length === 1) || + !this.props.readonly + ); } get tags() { @@ -75,6 +86,10 @@ export const kanbanMany2ManyTagsAvatarUserField = { ...listKanbanMany2ManyTagsAvatarField, component: KanbanMany2ManyTagsAvatarUserField, additionalClasses: ["o_field_many2many_tags_avatar"], + extractProps: (fieldInfo) => ({ + ...listKanbanMany2ManyTagsAvatarField.extractProps(fieldInfo), + displayText: fieldInfo.viewType === "list", + }), }; registry.category("fields").add("kanban.many2many_avatar_user", kanbanMany2ManyTagsAvatarUserField); diff --git a/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.js b/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.js index 7ea2f78989e..117c642eaa9 100644 --- a/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.js +++ b/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.js @@ -9,11 +9,18 @@ import { useOpenChat } from "@mail/views/open_chat_hook"; import { useAssignUserCommand } from "@mail/views/fields/assign_user_command_hook"; export class Many2OneAvatarUserField extends Many2OneAvatarField { + static props = { + ...Many2OneAvatarField.props, + withCommand: { type: Boolean, optional: true }, + }; + setup() { super.setup(); const relation = this.props.record.fields[this.props.name].relation; this.openChat = useOpenChat(relation); - useAssignUserCommand(); + if (this.props.withCommand) { + useAssignUserCommand(); + } } onClickAvatar() { @@ -26,21 +33,15 @@ export const many2OneAvatarUserField = { ...many2OneAvatarField, component: Many2OneAvatarUserField, additionalClasses: ["o_field_many2one_avatar"], + extractProps: (fieldInfo) => ({ + ...many2OneAvatarField.extractProps(fieldInfo), + withCommand: fieldInfo.viewType === "form", + }), }; registry.category("fields").add("many2one_avatar_user", many2OneAvatarUserField); -export class KanbanMany2OneAvatarUserField extends Many2OneAvatarUserField { - /** - * All props are normally passed to the Many2OneField however since - * we add a new one, we need to filter it out. - */ - get m2oFieldProps() { - return Object.fromEntries( - Object.entries(this.props).filter(([key, _val]) => key in Many2OneAvatarField.props) - ); - } -} +export class KanbanMany2OneAvatarUserField extends Many2OneAvatarUserField {} KanbanMany2OneAvatarUserField.template = "mail.KanbanMany2OneAvatarUserField"; KanbanMany2OneAvatarUserField.props = { ...Many2OneAvatarUserField.props, diff --git a/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.xml b/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.xml index 3a7c4db0b44..2be39a3990a 100644 --- a/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.xml +++ b/addons/mail/static/src/views/fields/many2one_avatar_user_field/many2one_avatar_user_field.xml @@ -9,7 +9,6 @@ props.readonly and props.displayAvatarName - m2oFieldProps diff --git a/addons/project/static/src/components/project_state_selection/project_state_selection.js b/addons/project/static/src/components/project_state_selection/project_state_selection.js index 0be3a7aef74..cffef1e1fb7 100644 --- a/addons/project/static/src/components/project_state_selection/project_state_selection.js +++ b/addons/project/static/src/components/project_state_selection/project_state_selection.js @@ -15,13 +15,6 @@ export class ProjectStateSelectionField extends StateSelectionField { this.colors = STATUS_COLORS; } - /** - * @override - */ - get showLabel() { - return !this.props.hideLabel; - } - /** * @override */ @@ -33,6 +26,10 @@ export class ProjectStateSelectionField extends StateSelectionField { export const projectStateSelectionField = { ...stateSelectionField, component: ProjectStateSelectionField, + extractProps: (fieldInfo) => ({ + ...stateSelectionField.extractProps(fieldInfo), + hideLabel: !!fieldInfo.options.hideLabel, + }), }; registry.category("fields").add("kanban.project_state_selection", projectStateSelectionField); diff --git a/addons/project/static/src/views/fields/project_task_priority_switch_field.js b/addons/project/static/src/views/fields/project_task_priority_switch_field.js index f18494167a5..9d4e0094e21 100644 --- a/addons/project/static/src/views/fields/project_task_priority_switch_field.js +++ b/addons/project/static/src/views/fields/project_task_priority_switch_field.js @@ -3,35 +3,28 @@ import { sprintf } from "@web/core/utils/strings"; import { registry } from "@web/core/registry"; import { PriorityField, priorityField } from "@web/views/fields/priority/priority_field"; -import { useCommand } from "@web/core/commands/command_hook"; -import { useState } from "@odoo/owl"; export class PrioritySwitchField extends PriorityField { - setup() { - this.state = useState({ - index: -1, - }); - if (this.props.record.activeFields[this.props.name].viewType !== "form") { - return; - } - - for (const [id, name] of this.options) { - useCommand( - sprintf(this.env._t("Set priority as %s"), name), - () => this.props.update(id), - { - category: "smart_action", - hotkey: "alt+r", - isAvailable: () => this.props.value !== id, - } - ); - } + get commands() { + return this.options.map(([id, name]) => [ + sprintf(this.env._t("Set priority as %s"), name), + () => this.updateRecord(id), + { + category: "smart_action", + hotkey: "alt+r", + isAvailable: () => this.props.value !== id, + }, + ]); } } export const prioritySwitchField = { ...priorityField, component: PrioritySwitchField, + extractProps: (fieldInfo) => ({ + ...priorityField.extractProps(fieldInfo), + withCommand: fieldInfo.viewType === "form", + }), }; registry.category("fields").add("priority_switch", prioritySwitchField); diff --git a/addons/purchase_requisition/static/src/widgets/purchase_order_alternatives_widget.js b/addons/purchase_requisition/static/src/widgets/purchase_order_alternatives_widget.js index 31afa394b5d..e02ec9b3589 100644 --- a/addons/purchase_requisition/static/src/widgets/purchase_order_alternatives_widget.js +++ b/addons/purchase_requisition/static/src/widgets/purchase_order_alternatives_widget.js @@ -16,11 +16,13 @@ FieldMany2ManyAltPOsRenderer.recordRowTemplate = "purchase_requisition.AltPOsLis export class FieldMany2ManyAltPOs extends X2ManyField { setup() { + super.setup(); this.orm = useService("orm"); this.action = useService("action"); - // TODO: this is a terrible hack, make this a proper extension of many2many if/when possible - this.props.record.activeFields[this.props.name].widget = "many2many"; - super.setup(); + } + + get isMany2Many() { + return true; } /** diff --git a/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js b/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js index 338c688d994..3fdf54b0760 100644 --- a/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js +++ b/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js @@ -10,15 +10,12 @@ export class BooleanIconField extends Component { static props = { ...standardFieldProps, icon: { type: String, optional: true }, + label: { type: String, optional: true }, }; static defaultProps = { icon: "fa-check-square-o", }; - get label() { - return this.props.record.activeFields[this.props.name].string; - } - update() { this.props.record.update({ [this.props.name]: !this.props.value }); } @@ -28,8 +25,9 @@ export const booleanIconField = { component: BooleanIconField, displayName: _lt("Boolean Icon"), supportedTypes: ["boolean"], - extractProps: ({ options }) => ({ + extractProps: ({ options, string }) => ({ icon: options.icon, + label: string, }), }; diff --git a/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.xml b/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.xml index c16feb215a5..d3b9e5c9cae 100644 --- a/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.xml +++ b/addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.xml @@ -2,7 +2,7 @@ -