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 @@ -