From 0c3272a20cf316d51f8875870a4dfc7a4cd10e3c Mon Sep 17 00:00:00 2001 From: "Ignacio J. Ortega" Date: Thu, 5 Sep 2024 13:16:05 +0200 Subject: [PATCH] [UPD] if the groups fields is relational try to use sequence field in related model if it exists --- web_timeline/README.rst | 6 +- .../static/src/js/timeline_renderer.js | 123 +++++++++++------- 2 files changed, 78 insertions(+), 51 deletions(-) diff --git a/web_timeline/README.rst b/web_timeline/README.rst index 285516b268eb..431437a714e8 100644 --- a/web_timeline/README.rst +++ b/web_timeline/README.rst @@ -2,7 +2,7 @@ Web timeline ============ -.. +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! @@ -69,6 +69,8 @@ the possible attributes for the tag: +--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | colors | No | Allows to set certain specific colors if the expressed condition (JS syntax) is met. | +--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| color_field | No | Gets the color for the bar from field named here, if specified colors are set after this color | ++--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | dependency_arrow | No | Set this attribute to a x2many field to draw arrows between the records referenced in the x2many field. | +--------------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -258,7 +260,7 @@ promote its widespread use. Current `maintainer `__: -|maintainer-tarteo| +|maintainer-tarteo| This module is part of the `OCA/web `_ project on GitHub. diff --git a/web_timeline/static/src/js/timeline_renderer.js b/web_timeline/static/src/js/timeline_renderer.js index 408ec80de0f2..3c7878295ebc 100644 --- a/web_timeline/static/src/js/timeline_renderer.js +++ b/web_timeline/static/src/js/timeline_renderer.js @@ -378,66 +378,91 @@ odoo.define("web_timeline.TimelineRenderer", function (require) { * @returns {Array} */ split_groups: async function (events, group_bys) { - if (group_bys.length === 0) { - return events; - } - const groups = []; - groups.push({id: -1, content: _t("UNASSIGNED"), order: -1}); - var seq = 1; + if (group_bys.length === 0) return events; + + const groups = [{id: -1, content: _t("UNASSIGNED"), order: -1}]; + let seq = 1; + const fieldCache = {}; + for (const evt of events) { const grouped_field = _.first(group_bys); const group_name = evt[grouped_field]; - if (group_name) { - if (group_name instanceof Array) { - const group = _.find( - groups, - (existing_group) => existing_group.id === group_name[0] - ); - if (_.isUndefined(group)) { - // Check if group is m2m in this case add id -> value of all - // found entries. - await this._rpc({ - model: this.modelName, - method: "fields_get", - args: [[grouped_field]], + if (!group_name || !(group_name instanceof Array)) continue; + + const group = _.find( + groups, + (existing_group) => existing_group.id === group_name[0] + ); + if (group) continue; + + const fields = await this._rpc({ + model: this.modelName, + method: "fields_get", + args: [[grouped_field]], + context: this.getSession().user_context, + }); + + const fieldType = fields[grouped_field].type; + const relation = fields[grouped_field].relation; + + if (fieldType !== "many2one" && fieldType !== "many2many") { + groups.push({ + id: group_name[0], + content: group_name[1], + order: seq++, + }); + continue; + } + + if (!fieldCache[relation]) { + fieldCache[relation] = await this._rpc({ + model: relation, + method: "fields_get", + args: [[]], + context: this.getSession().user_context, + }); + } + + const hasSequence = "sequence" in fieldCache[relation]; + + if (fieldType === "many2one") { + if (hasSequence) { + const group_data = await this._rpc({ + model: relation, + method: "read", + args: [group_name[0], ["sequence"]], + context: this.getSession().user_context, + }); + seq = group_data[0].sequence || seq; + } + groups.push({ + id: group_name[0], + content: group_name[1], + order: seq++, + }); + } else if (fieldType === "many2many") { + const list_values = await this.get_m2m_grouping_datas( + relation, + group_name + ); + for (const vals of list_values) { + if (groups.some((gr) => gr.id === vals.id)) continue; + if (hasSequence) { + const group_data = await this._rpc({ + model: relation, + method: "read", + args: [vals.id, ["sequence"]], context: this.getSession().user_context, - }).then(async (fields) => { - if (fields[grouped_field].type === "many2many") { - const list_values = - await this.get_m2m_grouping_datas( - fields[grouped_field].relation, - group_name - ); - for (const vals of list_values) { - let is_inside = false; - for (const gr of groups) { - if (vals.id === gr.id) { - is_inside = true; - break; - } - } - if (!is_inside) { - vals.order = seq; - seq += 1; - groups.push(vals); - } - } - } else { - groups.push({ - id: group_name[0], - content: group_name[1], - order: seq, - }); - seq += 1; - } }); + seq = group_data[0].sequence || seq; } + vals.order = seq++; + groups.push(vals); } } } return groups; }, - get_m2m_grouping_datas: async function (model, group_name) { const groups = []; for (const gr of group_name) {