From d94a3087be73c522389ab418656ed0e5dc8e0ae5 Mon Sep 17 00:00:00 2001 From: "John Laterre (jol)" Date: Thu, 3 Aug 2023 09:54:40 +0000 Subject: [PATCH] [IMP] account,analytic: UI/UX improvements Miscellaneous improvements: 1. In analytic tags, the percentage is now a prefix. 2. In the widget, 0% accounts are now hidden. 3. In the analytic items list/pivot views, it is now possible to search by: - Financial Account. - Cross by. 4. By default, the pivot view is now grouped by plans and then analytic accounts. 5. An "Analytic Reporting" menuitem that opens the pivot view is added in Reporting > Management. task-3446504 closes odoo/odoo#130971 X-original-commit: adb8ec875c9b4e299147c46dc60a87fd26fff91f Signed-off-by: Habib Ayob (ayh) Signed-off-by: John Laterre (jol) --- .../views/account_analytic_line_views.xml | 10 +++++++++- addons/account/views/account_menuitem.xml | 1 + .../analytic_distribution.js | 2 +- .../analytic_distribution.xml | 2 +- .../tests/analytic_distribution_tests.js | 20 +++++++++---------- addons/analytic/views/analytic_line_views.xml | 6 ++++-- 6 files changed, 26 insertions(+), 15 deletions(-) diff --git a/addons/account/views/account_analytic_line_views.xml b/addons/account/views/account_analytic_line_views.xml index 5ff9c9c634d..99396a77ae9 100644 --- a/addons/account/views/account_analytic_line_views.xml +++ b/addons/account/views/account_analytic_line_views.xml @@ -47,6 +47,7 @@ + @@ -64,7 +65,7 @@ - + @@ -79,5 +80,12 @@ + + + Analytic Reporting + account.analytic.line + pivot + + diff --git a/addons/account/views/account_menuitem.xml b/addons/account/views/account_menuitem.xml index 741b8a51a3b..6c5865b0cd3 100644 --- a/addons/account/views/account_menuitem.xml +++ b/addons/account/views/account_menuitem.xml @@ -38,6 +38,7 @@ + diff --git a/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js b/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js index 8baf23d8ebc..e9564114063 100644 --- a/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js +++ b/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js @@ -366,7 +366,7 @@ export class AnalyticDistribution extends Component { get tags() { return this.listReady.map((dist_tag) => ({ id: dist_tag.id, - text: `${dist_tag.analytic_account_name}${dist_tag.percentage > 99.99 && dist_tag.percentage < 100.01 ? "" : " " + this.formatPercentage(dist_tag.percentage)}`, + text: `${dist_tag.percentage > 99.99 && dist_tag.percentage < 100.01 ? "" : this.formatPercentage(dist_tag.percentage) + " "}${dist_tag.analytic_account_name}`, colorIndex: dist_tag.color, group_id: dist_tag.group_id, onClick: (ev) => this.tagClicked(ev, dist_tag.id), diff --git a/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.xml b/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.xml index c45722bb950..92dd344eca7 100644 --- a/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.xml +++ b/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.xml @@ -51,7 +51,7 @@ class="o_input" inputmode="numeric" type="text" - t-att-value="formatPercentage(dist_tag.percentage)" + t-att-value="dist_tag.analytic_account_id or dist_tag.percentage ? formatPercentage(dist_tag.percentage) : ''" t-on-click.stop="" t-on-change="(ev) => this.percentageChanged(dist_tag, ev)"/> diff --git a/addons/analytic/static/tests/analytic_distribution_tests.js b/addons/analytic/static/tests/analytic_distribution_tests.js index 46f7ad38b21..39c4e2d1b8f 100644 --- a/addons/analytic/static/tests/analytic_distribution_tests.js +++ b/addons/analytic/static/tests/analytic_distribution_tests.js @@ -152,11 +152,11 @@ QUnit.module("Analytic", (hooks) => { assert.containsOnce(target, ".o_field_analytic_distribution", "widget should be visible"); assert.containsN(target, ".badge", 2, "should contain 2 tags"); - assert.strictEqual(target.querySelector(".badge .o_tag_badge_text").textContent, "RD 30.3%", - "should have rendered tag 'RD 30.3%'" + assert.strictEqual(target.querySelector(".badge .o_tag_badge_text").textContent, "30.3% RD", + "should have rendered tag '30.3% RD'" ); - assert.strictEqual(target.querySelectorAll(".badge .o_tag_badge_text")[1].textContent, "FI 69.7%", - "should have rendered tag 'FI 69.7%'" + assert.strictEqual(target.querySelectorAll(".badge .o_tag_badge_text")[1].textContent, "69.7% FI", + "should have rendered tag '69.7% FI'" ); assert.containsN(target, ".o_delete", 2, "tags should contain a delete button"); @@ -262,13 +262,13 @@ QUnit.module("Analytic", (hooks) => { await click(target.querySelector(".o_select_button")); let percentageEls = [...popup.querySelectorAll("table#plan_5 .o_analytic_percentage input")]; - let expectedPercentages = ['100%', '0%', '0%']; + let expectedPercentages = ['100%', '0%', '']; for (const [i, el] of percentageEls.entries()) { assert.equal(el.value, expectedPercentages[i], `1: Percentage Element ${i} should be ${expectedPercentages[i]}`); } // modify the percentage of tag 1, tag 2 is filled await editInput(percentageEls[0], null, "50"); - expectedPercentages = ['50%', '50%', '0%']; + expectedPercentages = ['50%', '50%', '']; for (const [i, el] of percentageEls.entries()) { assert.equal(el.value, expectedPercentages[i], `2: Percentage Element ${i} should be ${expectedPercentages[i]}`); } @@ -290,21 +290,21 @@ QUnit.module("Analytic", (hooks) => { await click(target.querySelector(".o_select_button")); percentageEls = [...popup.querySelectorAll("table#plan_5 .o_analytic_percentage input")]; - expectedPercentages = ['40%', '50%', '10%', '0%', '0%', '0%']; + expectedPercentages = ['40%', '50%', '10%', '0%', '0%', '']; for (const [i, el] of percentageEls.entries()) { assert.equal(el.value, expectedPercentages[i], `4: Percentage Element ${i} should be ${expectedPercentages[i]}`); } // modify percentage of the tag 1 (focused), balance goes to the first zero (tag 4) await editInput(document.activeElement, null, "10"); - expectedPercentages = ['10%', '50%', '10%', '30%', '0%', '0%']; + expectedPercentages = ['10%', '50%', '10%', '30%', '0%', '']; for (const [i, el] of percentageEls.entries()) { assert.equal(el.value, expectedPercentages[i], `5: Percentage Element ${i} should be ${expectedPercentages[i]}`); } // modify percentage of tag 4, balance goes to the first zero (tag 5) await editInput(percentageEls[3], null, "20"); - expectedPercentages = ['10%', '50%', '10%', '20%', '10%', '0%']; + expectedPercentages = ['10%', '50%', '10%', '20%', '10%', '']; for (const [i, el] of percentageEls.entries()) { assert.equal(el.value, expectedPercentages[i], `6: Percentage Element ${i} should be ${expectedPercentages[i]}`); } @@ -326,7 +326,7 @@ QUnit.module("Analytic", (hooks) => { percentageEls = [...popup.querySelectorAll("table#plan_5 .o_analytic_percentage input")]; expectedPercentages = ['10%', '50%', '10%', '30%']; for (const [i, el] of percentageEls.entries()) { - assert.equal(el.value, expectedPercentages[i], `7: Percentage Element ${i} should be ${expectedPercentages[i]}`); + assert.equal(el.value, expectedPercentages[i], `8: Percentage Element ${i} should be ${expectedPercentages[i]}`); } assert.equal(popup.querySelector("table#plan_5 tr:last-of-type .o_analytic_account_name input").value, "", "Last tag's account is empty"); diff --git a/addons/analytic/views/analytic_line_views.xml b/addons/analytic/views/analytic_line_views.xml index 4c97ac0ccd4..2aaacf76d2b 100644 --- a/addons/analytic/views/analytic_line_views.xml +++ b/addons/analytic/views/analytic_line_views.xml @@ -29,6 +29,7 @@ + @@ -112,8 +113,9 @@ account.analytic.line + - + @@ -181,4 +183,4 @@

- \ No newline at end of file +