[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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user