[IMP] project,web: change groupby project label 'None' to 'Private'

Be consistent with the terminology used in all views,
'None' doesn't add value and makes the private task stage user-friendly.

Add filter "Private Tasks" to search private tasks easily.

task-3300649

Part-of: odoo/odoo#120668
This commit is contained in:
Audric Onockx (auon)
2023-07-14 15:34:35 +02:00
parent c025a8ad84
commit 09a90aa9ca
9 changed files with 156 additions and 3 deletions
+1
View File
@@ -70,6 +70,7 @@
'project/static/src/components/**/*',
'project/static/src/views/**/*',
'project/static/src/js/project_graph_view.js',
'project/static/src/js/project_pivot_model.js',
'project/static/src/js/project_pivot_view.js',
'project/static/src/js/project_rating_graph_view.js',
'project/static/src/js/project_rating_pivot_view.js',
@@ -0,0 +1,18 @@
/** @odoo-module **/
import { PivotModel } from "@web/views/pivot/pivot_model";
export class ProjectTaskPivotModel extends PivotModel {
/**
* @override
*/
_getEmptyGroupLabel(fieldName) {
if (fieldName === "project_id") {
return this.env._t("Private");
} else if (fieldName === "user_ids") {
return this.env._t("Unassigned");
} else {
return super._getEmptyGroupLabel(fieldName);
}
}
}
@@ -3,7 +3,12 @@
import { ProjectControlPanel } from "@project/components/project_control_panel/project_control_panel";
import { registry } from "@web/core/registry";
import { pivotView } from "@web/views/pivot/pivot_view";
import { ProjectTaskPivotModel } from "./project_pivot_model";
const projectPivotView = {...pivotView, ControlPanel: ProjectControlPanel};
const projectPivotView = {
...pivotView,
ControlPanel: ProjectControlPanel,
Model: ProjectTaskPivotModel,
};
registry.category("views").add("project_pivot", projectPivotView);
@@ -63,4 +63,17 @@ export class ProjectTaskKanbanHeader extends KanbanHeader {
canDeleteGroup(group) {
return super.canDeleteGroup(group) && (!this.props.list.isGroupedByStage || this.isProjectManager) || this.props.list.isGroupedByPersonalStages;
}
/**
* @override
*/
_getEmptyGroupLabel(fieldName) {
if (fieldName === "project_id") {
return this.env._t("🔒 Private");
} else if (fieldName === "user_ids") {
return this.env._t("👤 Unassigned");
} else {
return super._getEmptyGroupLabel(fieldName);
}
}
}
@@ -15,4 +15,15 @@ export class ProjectTaskListRenderer extends ListRenderer {
}
return readonly || super.isCellReadonly(column, record);
}
getGroupDisplayName(group) {
const { _t } = this.env;
if (group.groupByField.name === "project_id" && !group.value) {
return _t("🔒 Private");
} else if (group.groupByField.name === "user_ids" && !group.value) {
return _t("👤 Unassigned");
} else {
return super.getGroupDisplayName(group);
}
}
}
@@ -0,0 +1,95 @@
/** @odoo-module */
import { getFixture } from "@web/../tests/helpers/utils";
import { setupViewRegistries } from "@web/../tests/views/helpers";
import { start, startServer } from "@mail/../tests/helpers/test_utils";
let target;
QUnit.module("Project", (hooks) => {
hooks.beforeEach(async () => {
const pyEnv = await startServer();
pyEnv.mockServer.models['project.task'] = {
fields: {
id: { string: "Id", type: "integer" },
display_name: { string: "Name", type: "char" },
project_id: {
string: "Project",
type: "many2one",
relation: "project.project",
},
},
records: [{
id: 1,
display_name: "My task",
project_id: false,
}],
};
target = getFixture();
setupViewRegistries();
});
QUnit.test("Test group label for empty project in tree", async function (assert) {
assert.expect(1);
const views = {
"project.task,false,list":
`<tree js_class="project_task_list"/>`,
};
const { openView } = await start({
serverData: { views },
});
await openView({
res_model: "project.task",
views: [[false, "tree"]],
context: { group_by: ["project_id"] },
});
assert.strictEqual(target.querySelector(".o_group_name").innerText, "🔒 Private (1)");
});
QUnit.test("Test group label for empty project in kanban", async function (assert) {
assert.expect(1);
const views = {
"project.task,false,kanban":
`<kanban js_class="project_task_kanban" default_group_by="project_id">
<templates>
<t t-name="kanban-box"/>
</templates>
</kanban>`,
};
const { openView } = await start({
serverData: { views },
});
await openView({
res_model: "project.task",
views: [[false, "kanban"]],
});
assert.strictEqual(target.querySelector(".o_column_title").innerText, "🔒 Private (1)");
});
QUnit.test("Test group label for empty project in pivot", async function (assert) {
assert.expect(1);
const views = {
"project.task,false,pivot":
`<pivot js_class="project_pivot">
<field name="project_id" type="row"/>
</pivot>`,
};
const { openView } = await start({
serverData: { views },
});
await openView({
res_model: "project.task",
views: [[false, "pivot"]],
});
assert.strictEqual(
target.querySelector("tr:nth-of-type(2) .o_pivot_header_cell_closed").innerText,
"Private",
);
});
});
@@ -19,6 +19,7 @@
<filter string="Favorite Projects" name="favorite_projects" domain="[('project_id.is_favorite', '=', True)]" invisible="context.get('default_project_id')"/>
<separator/>
<filter string="Starred Tasks" name="starred_tasks" domain="[('priority', '=', '1')]"/>
<filter string="Private Tasks" name="private_tasks" domain="[('project_id', '=', False)]" invisible="context.get('default_project_id')"/>
<separator groups="project.group_project_task_dependencies"/>
<filter string="Blocked" name="blocked" domain="[('state', '=', '04_waiting_normal')]" groups="project.group_project_task_dependencies"/>
<filter string="Blocking" name="blocking" domain="[('state', 'not in', ['1_done','1_canceled']), ('dependent_ids', '!=', False)]" groups="project.group_project_task_dependencies"/>
@@ -75,6 +75,10 @@ export class KanbanHeader extends Component {
return this.props.group;
}
_getEmptyGroupLabel(fieldName) {
return this.env._t("None");
}
get groupName() {
const { groupByField, displayName } = this.group;
let name = displayName;
@@ -87,7 +91,7 @@ export class KanbanHeader extends Component {
groupByField.type === "datetime" ||
isNull(name)
) {
name = this.env._t("None");
name = this._getEmptyGroupLabel(groupByField.name);
}
}
return name;
@@ -1525,6 +1525,11 @@ export class PivotModel extends Model {
}
});
}
_getEmptyGroupLabel(fieldName) {
return this.env._t("None");
}
/**
* Extract from a groupBy value a label.
*
@@ -1549,7 +1554,7 @@ export class PivotModel extends Model {
: this.env._t("No");
}
if (value === false) {
return this.env._t("None");
return this._getEmptyGroupLabel(groupBy);
}
if (value instanceof Array) {
return this._getNumberedLabel(value, fieldName, config);