From 8278d82fa2cba6ea9c867398959679b2c9ed6b86 Mon Sep 17 00:00:00 2001 From: vlst Date: Thu, 22 Jun 2023 08:30:49 +0000 Subject: [PATCH] [IMP] point_of_sale: Partner Editor Reactivity At the moment, the partner editor in pos does not use the owl reactivity system, using instead an onchange function on each input and manually keeping track of state. This approach is overcomplicated and leads to bugs. The necessity of this task first appeared because of one such bug, namely: the `state` input options not changing in order to reflect the selected `country`. Instead of finding a patch for this problem, we decided in this PR to replace the old logic, making use of `useState` and `t-model`. closes odoo/odoo#126021 Task: 3323874 Related: odoo/enterprise#43372 Signed-off-by: Joseph Caburnay (jcb) --- .../partner_editor/partner_editor.js | 32 +++++--- .../partner_editor/partner_editor.xml | 80 +++++-------------- 2 files changed, 42 insertions(+), 70 deletions(-) diff --git a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js index 2431b47dfb5..d3050a3b60d 100644 --- a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js +++ b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js @@ -4,7 +4,7 @@ import { _t } from "@web/core/l10n/translation"; import { getDataURLFromFile } from "@web/core/utils/urls"; import { ErrorPopup } from "@point_of_sale/app/errors/popups/error_popup"; import { useService } from "@web/core/utils/hooks"; -import { Component } from "@odoo/owl"; +import { Component, useState } from "@odoo/owl"; import { usePos } from "@point_of_sale/app/store/pos_hook"; export class PartnerDetailsEdit extends Component { @@ -15,11 +15,21 @@ export class PartnerDetailsEdit extends Component { this.pos = usePos(); this.intFields = ["country_id", "state_id", "property_product_pricelist"]; const partner = this.props.partner; - this.changes = { - country_id: partner.country_id && partner.country_id[0], + this.changes = useState({ + name: partner.name || "", + street: partner.street || "", + city: partner.city || "", + zip: partner.zip || "", state_id: partner.state_id && partner.state_id[0], + country_id: partner.country_id && partner.country_id[0], + lang: partner.lang || "", + email: partner.email || "", + phone: partner.phone || "", + mobile: partner.mobile || "", + barcode: partner.barcode || "", + vat: partner.vat || "", property_product_pricelist: this.setDefaultPricelist(partner), - }; + }); Object.assign(this.props.imperativeHandle, { save: () => this.saveChanges(), }); @@ -48,12 +58,6 @@ export class PartnerDetailsEdit extends Component { return false; } } - /** - * Save to field `changes` all input changes from the form fields. - */ - captureChange(event) { - this.changes[event.target.name] = event.target.value; - } saveChanges() { const processedChanges = {}; for (const [key, value] of Object.entries(this.changes)) { @@ -63,6 +67,14 @@ export class PartnerDetailsEdit extends Component { processedChanges[key] = value; } } + if ( + processedChanges.state_id && + this.pos.states.find((state) => state.id === processedChanges.state_id) + .country_id[0] !== processedChanges.country_id + ) { + processedChanges.state_id = false; + } + if ((!this.props.partner.name && !processedChanges.name) || processedChanges.name === "") { return this.popup.add(ErrorPopup, { title: _t("A Customer Name Is Required"), diff --git a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml index bbae1ea7f64..c9f401f44c1 100644 --- a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml +++ b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml @@ -1,53 +1,37 @@ -
- Partner + Partner
- +
Street - +
City - +
Postcode - +
-
+
State - - @@ -55,13 +39,10 @@
Country - - @@ -71,12 +52,9 @@
Language - - @@ -84,46 +62,29 @@
Email - +
Phone - +
Mobile - +
Barcode - +
Tax ID - +
Pricelist - + + @@ -133,5 +94,4 @@
-