[FIX] web_hierarchy,hr_org_chart: remove highlight on focus record

Before this commit, the highlight added on a focus record, that styling
added was useful when we displayed only the first result in the search
to be able to build a tree but since now all the records found with
the search made by the user are shown without building a tree if it
is not possible then it is no longer needed to highlight the records
found.

This commit removes the highlight added on the focused record, the one
found by the search since it is not really needed.

task-3556262

closes odoo/odoo#138803

Signed-off-by: Sofie Gvaladze (sgv) <sgv@odoo.com>
This commit is contained in:
Xavier Bol (xbo)
2023-10-18 15:26:33 +00:00
parent 975a45dc62
commit f009f19fc5
6 changed files with 13 additions and 49 deletions
+1 -5
View File
@@ -88,8 +88,6 @@ class TestEmployee(TestHrCommon):
self.assertEqual(len(result), 3) self.assertEqual(len(result), 3)
for emp in employees: for emp in employees:
emp_dict = {'id': emp.id, 'parent_id': emp.parent_id.id and (emp.parent_id.id, emp.parent_id.display_name)} emp_dict = {'id': emp.id, 'parent_id': emp.parent_id.id and (emp.parent_id.id, emp.parent_id.display_name)}
if emp == self.employee_georges:
emp_dict['__focus__'] = True
self.assertIn(emp_dict, result) self.assertIn(emp_dict, result)
self.employee_pierre.parent_id = self.employee_georges self.employee_pierre.parent_id = self.employee_georges
@@ -97,14 +95,12 @@ class TestEmployee(TestHrCommon):
self.assertEqual(len(result), 3) self.assertEqual(len(result), 3)
for emp in employees: for emp in employees:
emp_dict = {'id': emp.id, 'parent_id': emp.parent_id.id and (emp.parent_id.id, emp.parent_id.display_name)} emp_dict = {'id': emp.id, 'parent_id': emp.parent_id.id and (emp.parent_id.id, emp.parent_id.display_name)}
if emp == self.employee_georges:
emp_dict['__focus__'] = True
self.assertIn(emp_dict, result) self.assertIn(emp_dict, result)
result = HrEmployee.hierarchy_read([('id', '=', self.employee_pierre.id)], ['id'], 'parent_id') result = HrEmployee.hierarchy_read([('id', '=', self.employee_pierre.id)], ['id'], 'parent_id')
self.assertEqual(len(result), 2) self.assertEqual(len(result), 2)
self.assertIn( self.assertIn(
{'id': self.employee_pierre.id, 'parent_id': (self.employee_georges.id, self.employee_georges.name), '__focus__': True}, {'id': self.employee_pierre.id, 'parent_id': (self.employee_georges.id, self.employee_georges.name)},
result result
) )
self.assertIn( self.assertIn(
+1 -3
View File
@@ -35,10 +35,8 @@ class Base(models.AbstractModel):
) )
} }
result = records.read(fields) result = records.read(fields)
if children_ids_per_record_id or focus_record: if children_ids_per_record_id:
for record_data in result: for record_data in result:
if record_data['id'] in children_ids_per_record_id: if record_data['id'] in children_ids_per_record_id:
record_data['__child_ids__'] = children_ids_per_record_id[record_data['id']] record_data['__child_ids__'] = children_ids_per_record_id[record_data['id']]
if record_data['id'] == focus_record.id:
record_data['__focus__'] = True
return result return result
@@ -33,10 +33,6 @@
cursor: pointer; cursor: pointer;
} }
&.o_hierarchy_node_highlighted {
border: 3px solid green;
}
.o_hierarchy_node_header { .o_hierarchy_node_header {
height: 30px; height: 30px;
@@ -12,11 +12,9 @@
<i class="fa fa-chevron-up"/> <i class="fa fa-chevron-up"/>
</button> </button>
</div> </div>
<div class="o_hierarchy_node w-100 h-100 d-flex flex-column justify-content-between" <div class="o_hierarchy_node w-100 h-100 d-flex flex-column justify-content-between border"
t-att-class="{ t-att-class="{
o_hierarchy_node_highlighted: props.node.isFocused, 'border-bottom-0': props.node.nodes.length or props.node.canShowChildNodes,
border: !props.node.isFocused,
'border-bottom-0': !props.node.isFocused and (props.node.nodes.length or props.node.canShowChildNodes),
}" }"
t-att-data-node-id="props.node.id" t-att-data-node-id="props.node.id"
t-on-click.synthetic="onGlobalClick" t-on-click.synthetic="onGlobalClick"
@@ -80,15 +80,6 @@ export class HierarchyNode {
return this.data.id; return this.data.id;
} }
/**
* Is the current node focused?
*
* @returns {Boolean}
*/
get isFocused() {
return Boolean(this.data.__focus__);
}
/** /**
* Get parent field name * Get parent field name
* *
@@ -680,11 +671,7 @@ export class HierarchyModel extends Model {
const resultStringified = JSON.stringify(result); const resultStringified = JSON.stringify(result);
const recordsPerParentId = {}; const recordsPerParentId = {};
const recordPerId = {}; const recordPerId = {};
let focusedRecord = null;
for (const record of result) { for (const record of result) {
if (record.__focus__) {
focusedRecord = record;
}
recordPerId[record.id] = record; recordPerId[record.id] = record;
const parentId = getIdOfMany2oneField(record[this.parentFieldName]); const parentId = getIdOfMany2oneField(record[this.parentFieldName]);
if (!(parentId.toString() in recordsPerParentId)) { if (!(parentId.toString() in recordsPerParentId)) {
@@ -693,8 +680,6 @@ export class HierarchyModel extends Model {
recordsPerParentId[parentId].push(record); recordsPerParentId[parentId].push(record);
} }
const data = []; const data = [];
const parentId = focusedRecord ? getIdOfMany2oneField(focusedRecord[this.parentFieldName]) : false;
const parentFocusedRecord = parentId && parentId in recordPerId ? recordPerId[parentId.toString()] : { id: false };
const recordIds = []; // to check if we have only one arborescence to display otherwise we display the result as the kanban view const recordIds = []; // to check if we have only one arborescence to display otherwise we display the result as the kanban view
for (const [parentId, records] of Object.entries(recordsPerParentId)) { for (const [parentId, records] of Object.entries(recordsPerParentId)) {
if (!parentId || !(parentId in recordPerId)) { if (!parentId || !(parentId in recordPerId)) {
@@ -712,12 +697,7 @@ export class HierarchyModel extends Model {
} }
} }
if (!data.length && result?.length) { if (!data.length && result?.length) {
if (focusedRecord) { data.push(recordPerId[Object.keys(recordsPerParentId)[0]]);
let record = parentFocusedRecord || focusedRecord;
data.push(record);
} else {
data.push(recordPerId[Object.keys(recordsPerParentId)[0]])
}
} }
return data; return data;
} }
@@ -89,7 +89,6 @@ QUnit.module("Views", (hooks) => {
assert.containsOnce(target, ".o_hierarchy_line_right"); assert.containsOnce(target, ".o_hierarchy_line_right");
assert.containsN(target, ".o_hierarchy_node_container", 3); assert.containsN(target, ".o_hierarchy_node_container", 3);
assert.containsN(target, ".o_hierarchy_node", 3); assert.containsN(target, ".o_hierarchy_node", 3);
assert.containsNone(target, ".o_hierarchy_node_highlighted");
assert.containsN(target, ".o_hierarchy_node_button", 2); assert.containsN(target, ".o_hierarchy_node_button", 2);
assert.containsOnce(target, ".o_hierarchy_node_button.btn-primary"); assert.containsOnce(target, ".o_hierarchy_node_button.btn-primary");
assert.strictEqual(target.querySelector(".o_hierarchy_node_button.btn-primary").textContent.trim(), "Unfold 1"); assert.strictEqual(target.querySelector(".o_hierarchy_node_button.btn-primary").textContent.trim(), "Unfold 1");
@@ -251,8 +250,10 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_hierarchy_row", 2); assert.containsN(target, ".o_hierarchy_row", 2);
assert.containsN(target, ".o_hierarchy_node", 2); assert.containsN(target, ".o_hierarchy_node", 2);
assert.containsN(target, ".o_hierarchy_separator", 1); assert.containsN(target, ".o_hierarchy_separator", 1);
assert.containsOnce(target, ".o_hierarchy_node_highlighted"); assert.deepEqual(
assert.strictEqual(target.querySelector(".o_hierarchy_node_highlighted").textContent.trim(), "LouisJosephine"); getNodesTextContent(target.querySelectorAll(".o_hierarchy_node_content")),
["JosephineAlbert", "LouisJosephine"],
);
}); });
QUnit.test("search record in hierarchy view with child field name defined in the arch", async function (assert) { QUnit.test("search record in hierarchy view with child field name defined in the arch", async function (assert) {
@@ -267,8 +268,10 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_hierarchy_row", 2); assert.containsN(target, ".o_hierarchy_row", 2);
assert.containsN(target, ".o_hierarchy_node", 2); assert.containsN(target, ".o_hierarchy_node", 2);
assert.containsN(target, ".o_hierarchy_separator", 1); assert.containsN(target, ".o_hierarchy_separator", 1);
assert.containsOnce(target, ".o_hierarchy_node_highlighted"); assert.deepEqual(
assert.strictEqual(target.querySelector(".o_hierarchy_node_highlighted").textContent.trim(), "LouisJosephine"); getNodesTextContent(target.querySelectorAll(".o_hierarchy_node_content")),
["JosephineAlbert", "LouisJosephine"],
);
}); });
QUnit.test("fetch parent record", async function (assert) { QUnit.test("fetch parent record", async function (assert) {
@@ -282,8 +285,6 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_hierarchy_row", 2); assert.containsN(target, ".o_hierarchy_row", 2);
assert.containsN(target, ".o_hierarchy_node", 2); assert.containsN(target, ".o_hierarchy_node", 2);
assert.containsN(target, ".o_hierarchy_separator", 1); assert.containsN(target, ".o_hierarchy_separator", 1);
assert.containsOnce(target, ".o_hierarchy_node_highlighted");
assert.strictEqual(target.querySelector(".o_hierarchy_node_highlighted").textContent.trim(), "LouisJosephine");
let rows = target.querySelectorAll(".o_hierarchy_row"); let rows = target.querySelectorAll(".o_hierarchy_row");
let row = rows[0]; let row = rows[0];
assert.containsOnce(row, ".o_hierarchy_node"); assert.containsOnce(row, ".o_hierarchy_node");
@@ -300,8 +301,6 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_hierarchy_row", 3); assert.containsN(target, ".o_hierarchy_row", 3);
assert.containsN(target, ".o_hierarchy_node", 4); assert.containsN(target, ".o_hierarchy_node", 4);
assert.containsN(target, ".o_hierarchy_separator", 2); assert.containsN(target, ".o_hierarchy_separator", 2);
assert.containsOnce(target, ".o_hierarchy_node_highlighted");
assert.strictEqual(target.querySelector(".o_hierarchy_node_highlighted").textContent.trim(), "LouisJosephine");
rows = target.querySelectorAll(".o_hierarchy_row"); rows = target.querySelectorAll(".o_hierarchy_row");
row = rows[0]; row = rows[0];
assert.containsOnce(row, ".o_hierarchy_node"); assert.containsOnce(row, ".o_hierarchy_node");
@@ -682,8 +681,5 @@ QUnit.module("Views", (hooks) => {
["JosephineAlbert", "LisaJosephine", "LouisJosephine"] ["JosephineAlbert", "LisaJosephine", "LouisJosephine"]
); );
assert.containsOnce(target, ".o_hierarchy_node_container button[name=hierarchy_search_parent_node]"); assert.containsOnce(target, ".o_hierarchy_node_container button[name=hierarchy_search_parent_node]");
assert.containsOnce(target, ".o_hierarchy_node_highlighted");
assert.containsOnce(target, ".o_hierarchy_node.o_hierarchy_node_highlighted");
assert.strictEqual(target.querySelector(".o_hierarchy_node_highlighted .o_hierarchy_node_content").textContent, "LisaJosephine");
}); });
}); });