19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:56 +01:00
parent a2f74aefd8
commit 4a4d12c333
844 changed files with 212348 additions and 270090 deletions

View file

@ -1,63 +1,78 @@
/** @odoo-module */
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
import tour from 'web_tour.tour';
tour.register('personal_stage_tour', {
test: true,
url: '/web',
},
[tour.stepUtils.showAppsMenuItem(), {
registry.category("web_tour.tours").add('personal_stage_tour', {
url: '/odoo',
steps: () => [stepUtils.showAppsMenuItem(), {
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
run: "click",
}, {
content: "Open Pig Project",
trigger: '.o_kanban_record:contains("Pig")',
run: "click",
}, {
// Default is grouped by stage, user should not be able to create/edit a column
content: "Check that there is no create column",
trigger: "body:not(.o_column_quick_create)",
run: function () {},
}, {
content: "Check that there is no create column",
trigger: "body:not(.o_column_edit)",
run: function () {},
trigger: "body:not(.o_group_edit)",
}, {
content: "Check that there is no create column",
trigger: "body:not(.o_column_delete)",
run: function () {},
trigger: "body:not(.o_group_delete)",
}, {
content: "Go to tasks",
trigger: 'button[data-menu-xmlid="project.menu_project_management"]',
run: "click",
},{
content: "Go to my tasks", // My tasks is grouped by personal stage by default
trigger: 'a[data-menu-xmlid="project.menu_project_management"]',
trigger: 'a[data-menu-xmlid="project.menu_project_management_my_tasks"]',
run: "click",
}, {
content: "Check that we can create a new stage",
trigger: '.o_column_quick_create .o_quick_create_folded'
trigger: '.o_column_quick_create.o_quick_create_folded div',
run: "click",
}, {
content: "Create a new personal stage",
trigger: 'input.form-control.o_input',
run: 'text Never',
trigger: 'input.form-control',
run: "edit Never",
}, {
content: "Confirm create",
trigger: '.o_kanban_add',
run: "click",
}, {
content: "Check that column exists",
trigger: '.o_kanban_header:contains("Never")',
run: function () {},
}, {
content: 'Open column edit dropdown',
trigger: '.o_kanban_header:eq(0)',
run: function () {
document.querySelector('.o_kanban_config.dropdown .dropdown-toggle').dispatchEvent(new Event('click'));
},
content: "Check that column exists && Open column edit dropdown",
trigger: ".o_kanban_header:contains(Never)",
run: "hover && click .o_kanban_header:contains(Never) .dropdown-toggle",
}, {
content: "Try editing inbox",
trigger: ".dropdown-item.o_column_edit",
trigger: ".dropdown-item.o_group_edit",
run: "click",
}, {
content: "Change title",
trigger: 'div.o_field_char[name="name"] input',
run: 'text (Todo)',
run: "edit ((Todo))",
}, {
content: "Save changes",
trigger: '.btn-primary:contains("Save")',
run: "click",
}, {
content: "Check that column was updated",
trigger: '.o_kanban_header:contains("Todo")',
}]);
run: "click",
}, {
content: "Create a personal task from the quick create form",
trigger: '.o-kanban-button-new',
run: "click",
}, {
content: "Create a new personal task",
trigger: 'input.o_input:not(.o_searchview_input)',
run: "edit New Test Task",
}, {
content: "Confirm create",
trigger: '.o_kanban_add',
run: "click",
}, {
content: "Check that task exists",
trigger: '.o_kanban_record:contains("New Test Task")',
}]});

View file

@ -1,79 +1,85 @@
/** @odoo-module */
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
import tour from 'web_tour.tour';
tour.register('burndown_chart_tour', {
test: true,
url: '/web',
},
[tour.stepUtils.showAppsMenuItem(), {
registry.category("web_tour.tours").add('burndown_chart_tour', {
url: '/odoo',
steps: () => [stepUtils.showAppsMenuItem(), {
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
run: "click",
}, {
content: 'Open "Burndown Chart Test" project menu',
trigger: '.o_kanban_record:contains("Burndown Chart Test") .o_kanban_manage_toggle_button',
trigger: ".o_kanban_record:contains(Burndown Chart Test)",
run: `hover && click .o_kanban_record:contains(Burndown Chart Test) .o_dropdown_kanban .dropdown-toggle`,
}, {
content: `Open "Burndown Chart Test" project's "Burndown Chart" view`,
trigger: '.o_kanban_record:contains("Burndown Chart Test") .o_kanban_manage_reporting div[role="menuitem"] a:contains("Burndown Chart")',
}, {
trigger: '.o_kanban_manage_reporting div[role="menuitem"] a:contains("Burndown Chart")',
run: "click",
},
{
trigger: ".o_graph_renderer",
},
{
content: 'The sort buttons are not rendered',
trigger: '.o_cp_bottom_left:not(:has(.btn-group[role=toolbar][aria-label="Sort graph"]))',
extra_trigger: '.o_graph_renderer',
trigger: '.o_graph_renderer:not(:has(.btn-group[role=toolbar][aria-label="Sort graph"]))',
run: "click",
}, {
content: 'Remove the project search "Burndown Chart Test"',
trigger: '.o_searchview_facet:contains("Burndown Chart Test") .o_facet_remove',
trigger: ".o_searchview_facet:contains(Burndown Chart Test)",
run: "hover && click .o_facet_remove",
}, {
content: 'Search Burndown Chart',
trigger: 'input.o_searchview_input',
run: `text Burndown`,
run: `edit Burndown`,
}, {
content: 'Validate search',
trigger: '.o_searchview_autocomplete .o_menu_item:contains("Project")',
trigger: '.o_searchview_autocomplete .o-dropdown-item:contains("Project")',
run: "click",
}, {
content: 'Remove the group by "Date: Month > Stage"',
trigger: '.o_searchview_facet:contains("Date: Month") .o_facet_remove',
trigger: '.o_searchview_facet:contains("Stage") .o_facet_remove',
run: "click",
}, {
content: 'A "The Burndown Chart must be grouped by Date and Stage" notification is shown when trying to remove the group by "Date: Month > Stage"',
trigger: '.o_notification_manager .o_notification:contains("The Burndown Chart must be grouped by Date and Stage") button.o_notification_close',
trigger: '.o_notification_manager .o_notification:contains("The report should be grouped either by ") button.o_notification_close',
run: "click",
}, {
content: 'Open the group by menu',
trigger: '.o_group_by_menu button',
content: 'Open the search panel menu',
trigger: '.o_control_panel .o_searchview_dropdown_toggler',
run: "click",
}, {
content: 'The Stage group menu item is invisible',
trigger: '.o_group_by_menu:not(:has(.o_menu_item:contains("Stage")))',
content: 'The Stage group menu item is visible',
trigger: '.o_group_by_menu .o_menu_item:contains("Stage")',
run: "click",
}, {
content: 'Open the Date group by sub menu',
trigger: '.o_group_by_menu button.o_menu_item:contains("Date")',
run: function () {
this.$anchor[0].dispatchEvent(new Event('mouseenter'));
},
run: "click",
}, {
content: 'Click on the selected Date sub menu',
trigger: '.o_group_by_menu button.o_menu_item:contains("Date") + * .dropdown-item.selected',
run: function () {
this.$anchor[0].dispatchEvent(new Event('click'));
},
run: "click",
}, {
content: 'A "The Burndown Chart must be grouped by Date" notification is shown when trying to remove the group by "Date: Month > Stage"',
trigger: '.o_notification_manager .o_notification:contains("The Burndown Chart must be grouped by Date") button.o_notification_close',
run: "click",
}, {
content: 'Open the filter menu',
trigger: '.o_filter_menu button',
content: 'Open the search panel menu',
trigger: '.o_control_panel .o_searchview_dropdown_toggler',
run: "click",
}, {
content: 'Open the Date filter sub menu',
trigger: '.o_filter_menu button.o_menu_item:contains("Date")',
run: function () {
this.$anchor[0].dispatchEvent(new Event('mouseenter'));
},
run: "click",
}, {
content: 'Click on the first Date filter sub menu',
trigger: '.o_filter_menu .o_menu_item:contains("Date") + * .dropdown-item:first-child',
run: function () {
this.$anchor[0].dispatchEvent(new Event('click'));
},
run: "click",
}, {
content: 'Close the Date filter menu',
trigger: '.o_graph_renderer',
run: "click",
}, {
content: 'The comparison menu is not rendered',
trigger: '.o_search_options:not(:has(.o_comparison_menu))',
}]);
content: 'Open the search panel menu',
trigger: '.o_control_panel .o_searchview_dropdown_toggler',
run: "click",
}]});

View file

@ -1,115 +1,256 @@
/** @odoo-module **/
import { delay } from "@web/core/utils/concurrency";
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
import tour from 'web_tour.tour';
const projectSharingSteps = [...tour.stepUtils.goToAppSteps("project.menu_main_pm", 'Go to the Project App.'), {
trigger: '.oe_kanban_global_click :contains("Project Sharing") button.o_dropdown_kanban',
content: 'Open the project dropdown.'
const projectSharingSteps = [...stepUtils.goToAppSteps("project.menu_main_pm", 'Go to the Project App.'), {
trigger: ".o_kanban_record:contains(Project Sharing)",
content: 'Open the project dropdown.',
run: "hover && click .o_kanban_record:contains(Project Sharing) .o_dropdown_kanban .dropdown-toggle",
}, {
trigger: '.o_kanban_record:contains("Project Sharing") .dropdown-menu a:contains("Share")',
trigger: '.dropdown-menu a:contains("Share")',
content: 'Start editing the project.',
run: "click",
}, {
trigger: 'div.o_field_radio[name="access_mode"] div.o_radio_item > input[data-value="edit"]',
content: 'Select "Edit" as Access mode in the "Share Project" wizard.',
trigger: '.modal div[name="collaborator_ids"] .o_field_x2many_list_row_add > a',
content: 'Add a collaborator to the project.',
run: "click",
}, {
trigger: '.o_field_many2many_tags_email[name=partner_ids]',
trigger: '.modal div[name="collaborator_ids"] div[name="partner_id"] input',
content: 'Select the user portal as collaborator to the "Project Sharing" project.',
run: function (actions) {
actions.text('Georges', this.$anchor.find('input'));
},
run: "edit Georges",
}, {
trigger: '.ui-autocomplete a.dropdown-item:contains("Georges")',
in_modal: false,
run: "click",
}, {
trigger: 'footer > button[name="action_send_mail"]',
trigger: '.modal div[name="collaborator_ids"] div[name="access_mode"] input',
content: 'Open Access mode selection dropdown.',
run: 'click',
},{
trigger: '.o_select_menu_item:contains(Edit)',
run: 'click',
}, {
trigger: '.modal footer > button[name="action_share_record"]',
content: 'Confirm the project sharing with this portal user.',
}, {
run: "click",
},
{
trigger: "body:not(:has(.modal))",
},
{
trigger: '.o_web_client',
content: 'Go to project portal view to select the "Project Sharing" project',
run: function () {
window.location.href = window.location.origin + '/my/projects';
},
expectUnloadPage: true,
}, {
id: 'project_sharing_feature',
trigger: 'table > tbody > tr a:has(span:contains(Project Sharing))',
content: 'Select "Project Sharing" project to go to project sharing feature for this project.',
run: "click",
expectUnloadPage: true,
}, {
trigger: '.o_project_sharing',
trigger: '.o_project_sharing .o_kanban_renderer',
content: 'Wait the project sharing feature be loaded',
run: function () {},
}, {
trigger: 'button.o-kanban-button-new',
content: 'Click "Create" button',
run: 'click',
}, {
trigger: '.o_kanban_quick_create .o_field_widget[name="name"] input',
trigger: '.o_kanban_quick_create .o_field_widget[name=name] input',
content: 'Create Task',
run: 'text Test Create Task',
run: "edit Test Create Task",
}, {
content: "Check that task stages cannot be drag and dropped",
trigger: '.o_kanban_group:not(.o_group_draggable)',
}, {
trigger: '.o_kanban_quick_create .o_kanban_edit',
content: 'Go to the form view of this new task',
run: "click",
}, {
trigger: 'div[name="stage_id"] div.o_statusbar_status button[aria-checked="false"]:contains(Done)',
content: 'Change the stage of the task.',
run: "click",
}, {
trigger: '.o_portal_chatter_composer_input .o_portal_chatter_composer_body textarea',
trigger: '.o-mail-Composer-input',
content: 'Write a message in the chatter of the task',
run: 'text I create a new task for testing purpose.',
run: "edit I create a new task for testing purpose.",
}, {
trigger: '.o_portal_chatter_composer_input .o_portal_chatter_composer_body button[name="send_message"]',
trigger: '.o-mail-Composer-send:enabled',
content: 'Send the message',
run: "click",
}, {
trigger: 'ol.breadcrumb > li.o_back_button > a:contains(Project Sharing)',
content: 'Go back to the kanban view',
run: "click",
}, {
trigger: '.o_filter_menu > button',
content: 'click on filter menu in the search view',
trigger: '.o_searchview_dropdown_toggler',
content: 'open the search panel menu',
run: "click",
}, {
trigger: '.o_filter_menu > .dropdown-menu > .dropdown-item:first-child',
trigger: '.o_filter_menu .dropdown-item:first-child',
content: 'click on the first item in the filter menu',
run: "click",
}, {
trigger: '.o_group_by_menu > button',
content: 'click on group by menu in the search view',
}, {
trigger: '.o_group_by_menu > .dropdown-menu > .dropdown-item:first-child',
trigger: '.o_group_by_menu .dropdown-item:first-child',
content: 'click on the first item in the group by menu',
run: "click",
}, {
trigger: '.o_favorite_menu > button',
content: 'click on the favorite menu in the search view',
trigger: '.o_favorite_menu .o_add_favorite',
content: 'open accordion "save current search" in favorite menu',
run: "click",
}, {
trigger: '.o_favorite_menu .o_add_favorite > button',
content: 'click to "save current search" button in favorite menu',
trigger: '.o_favorite_menu .o_accordion_values .o_save_favorite',
content: 'click to "save" button in favorite menu',
run: "click",
}, {
trigger: '.o_filter_menu > button',
content: 'click on filter menu in the search view',
}, {
trigger: '.o_filter_menu > .dropdown-menu > .dropdown-item:first-child',
trigger: '.o_filter_menu .dropdown-item:first-child',
content: 'click on the first item in the filter menu',
run: "click",
}, {
trigger: '.o_group_by_menu > button',
content: 'click on group by menu in the search view',
}, {
trigger: '.o_group_by_menu > .dropdown-menu > .dropdown-item:first-child',
trigger: '.o_group_by_menu .dropdown-item:first-child',
content: 'click on the first item in the group by menu',
run: "click",
}, {
trigger: '.o_favorite_menu > button',
content: 'click on the favorite menu in the search view',
}, {
trigger: '.o_favorite_menu .o_add_favorite > button',
content: 'click to "save current search" button in favorite menu',
trigger: '.o_favorite_menu .o_accordion_values .o_save_favorite',
content: 'click to "save" button in favorite menu',
run: "click",
}, {
trigger: 'button.o_switch_view.o_list',
content: 'Go to the list view',
run: "click",
}, {
trigger: '.o_list_view',
}, {
trigger: '.o_optional_columns_dropdown_toggle',
run: "click",
}, {
trigger: '.dropdown-item:contains("Milestone")',
}, {
trigger: '.o_list_view',
content: 'Check the list view',
}];
tour.register('project_sharing_tour', {
test: true,
url: '/web',
}, projectSharingSteps);
registry.category("web_tour.tours").add('project_sharing_tour', {
url: '/odoo',
steps: () => {
return projectSharingSteps;
}
});
// The begining of the project sharing feature
const projectSharingStepIndex = projectSharingSteps.findIndex(s => s.id && s.id === 'project_sharing_feature');
tour.register('portal_project_sharing_tour', {
test: true,
url: '/my/projects',
}, projectSharingSteps.slice(projectSharingStepIndex, projectSharingSteps.length));
registry.category("web_tour.tours").add("portal_project_sharing_tour", {
url: "/my/projects",
steps: () => {
// The begining of the project sharing feature
const projectSharingStepIndex = projectSharingSteps.findIndex(s => s?.id === 'project_sharing_feature');
return projectSharingSteps.slice(projectSharingStepIndex, projectSharingSteps.length);
}
});
registry.category("web_tour.tours").add("project_sharing_with_blocked_task_tour", {
url: "/my/projects",
steps: () => [{
trigger: 'table > tbody > tr a:has(span:contains("Project Sharing"))',
content: 'Click on the portal project.',
run: "click",
expectUnloadPage: true,
}, {
trigger: 'article.o_kanban_record',
content: 'Click on the task',
run: "click",
}, {
trigger: 'a:contains("Blocked By")',
content: 'Go to the Block by task tab',
run: "click",
}, {
trigger: 'i:contains("This task is currently blocked by")',
content: 'Check that the blocked task is not visible',
},
]});
registry.category("web_tour.tours").add("portal_project_sharing_tour_with_disallowed_milestones", {
url: "/my/projects",
steps: () => [
{
id: "project_sharing_feature",
trigger: "table > tbody > tr a:has(span:contains(Project Sharing))",
content:
'Select "Project Sharing" project to go to project sharing feature for this project.',
run: "click",
expectUnloadPage: true,
},
{
trigger: ".o_project_sharing",
content: "Wait the project sharing feature be loaded",
},
{
trigger: "button.o_switch_view.o_list",
content: "Go to the list view",
run: "click",
},
{
trigger: ".o_list_view",
},
{
trigger: ".o_optional_columns_dropdown_toggle",
run: "click",
},
{
trigger: ".dropdown-item",
},
{
trigger: ".dropdown-menu",
run: function () {
const optionalFields = Array.from(
this.anchor.ownerDocument.querySelectorAll(".dropdown-item")
).map((e) => e.textContent);
if (optionalFields.includes("Milestone")) {
throw new Error(
"the Milestone field should be absent as allow_milestones is set to False"
);
}
},
},
],
});
registry.category("web_tour.tours").add("test_04_project_sharing_chatter_message_reactions", {
url: "/my/projects",
steps: () => [
{
trigger: "table > tbody > tr a:has(span:contains(Project Sharing))",
run: "click",
expectUnloadPage: true,
},
{ trigger: ".o_project_sharing" },
{ trigger: ".o_kanban_record:contains('Test Task with messages')", run: "click" },
{ trigger: ".o-mail-Message" },
{ trigger: ".o-mail-Message .o-mail-MessageReaction:contains('👀')" },
],
});
registry.category("web_tour.tours").add("portal_project_sharing_chatter_mention_users", {
url: "/my/projects",
steps: () => [
{
trigger: "table > tbody > tr a:has(span:contains(Project Sharing))",
run: "click",
expectUnloadPage: true,
},
{ trigger: ".o_project_sharing" },
{ trigger: ".o_kanban_record:contains('Test Task')", run: "click" },
{ trigger: ".o-mail-Composer-input", run: "edit @xxx" },
{
trigger: "body:not(:has(.o-mail-Composer-suggestion))",
run: async () => {
const delay_fetch = odoo.loader.modules.get(
"@mail/core/common/suggestion_hook"
).DELAY_FETCH;
await delay(delay_fetch);
},
},
{ trigger: ".o-mail-Composer-input", run: "edit @Georges" },
{ trigger: ".o-mail-Composer-suggestion:contains('Georges')" },
],
});

View file

@ -1,56 +1,65 @@
/** @odoo-module **/
import tour from 'web_tour.tour';
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
function changeFilter(filterName) {
return [
{
trigger: '.o_favorite_menu button:has(i.fa-star)',
content: 'click on the favorite menu',
trigger: ".o_control_panel_actions .o_searchview_dropdown_toggler",
content: "open searchview menu",
run: "click",
},
{
trigger: `.o_favorite_menu .dropdown-item span:contains("${filterName}")`,
run: "click",
},
{
trigger: '.o_group_by_menu button:has(i.oi-group)',
content: 'click on the groupby menu',
run: function (actions) {
this.$anchor[0].dispatchEvent(new Event('mouseenter'));
},
},
{
trigger: '.o_group_by_menu span:contains("Stage")',
content: 'click on the stage gb',
trigger: ".o_control_panel_actions .o_searchview_dropdown_toggler",
content: "close searchview menu",
run: "click",
},
];
}
tour.register('project_tags_filter_tour',
{
test: true,
url: '/web',
},
[
tour.stepUtils.showAppsMenuItem(),
{
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
}, ...changeFilter("Corkscrew tail tag filter"),
{
trigger: '.o_kanban_group:has(.o_kanban_header:has(span:contains("pig"))) .o_kanban_record:has(span:contains("Pigs"))',
extra_trigger: '.o_kanban_group:has(.o_kanban_header:has(span:contains("goat"))):not(:has(.o_kanban_record))',
content: 'check that the corkscrew tail filter has taken effect',
run: () => {},
}, ...changeFilter("horned tag filter"),
{
trigger: '.o_kanban_group:has(.o_kanban_header:has(span:contains("goat"))) .o_kanban_record:has(span:contains("Goats"))',
extra_trigger: '.o_kanban_group:has(.o_kanban_header:has(span:contains("pig"))):not(:has(.o_kanban_record))',
content: 'check that the horned filter has taken effect',
run: () => {},
}, ...changeFilter("4 Legged tag filter"),
{
trigger: '.o_kanban_group:has(.o_kanban_header:has(span:contains("goat"))) .o_kanban_record:has(span:contains("Goats"))',
extra_trigger: '.o_kanban_group:has(.o_kanban_header:has(span:contains("pig"))) .o_kanban_record:has(span:contains("Pigs"))',
content: 'check that the 4 legged filter has taken effect',
run: () => {},
},
]);
registry.category("web_tour.tours").add("project_tags_filter_tour", {
url: "/odoo",
steps: () => [
stepUtils.showAppsMenuItem(),
{
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
run: "click",
},
...changeFilter("Corkscrew tail tag filter"),
{
trigger:
'.o_kanban_group:has(.o_kanban_header:has(span:contains("goat"))):not(:has(.o_kanban_record))',
content: "check that the corkscrew tail filter has taken effect",
},
{
trigger:
'.o_kanban_group:has(.o_kanban_header:has(span:contains("pig"))) .o_kanban_record:has(span:contains("Pigs"))',
content: "check that the corkscrew tail filter has taken effect",
},
...changeFilter("horned tag filter"),
{
trigger:
'.o_kanban_group:has(.o_kanban_header:has(span:contains("pig"))):not(:has(.o_kanban_record))',
content: "check that the horned filter has taken effect",
},
{
trigger:
'.o_kanban_group:has(.o_kanban_header:has(span:contains("goat"))) .o_kanban_record:has(span:contains("Goats"))',
content: "check that the horned filter has taken effect",
},
...changeFilter("4 Legged tag filter"),
{
trigger:
'.o_kanban_group:has(.o_kanban_header:has(span:contains("pig"))) .o_kanban_record:has(span:contains("Pigs"))',
content: "check that the 4 legged filter has taken effect",
},
{
trigger:
'.o_kanban_group:has(.o_kanban_header:has(span:contains("goat"))) .o_kanban_record:has(span:contains("Goats"))',
content: "check that the 4 legged filter has taken effect",
},
],
});

View file

@ -0,0 +1,278 @@
/**
* Project Task history tour.
* Features tested:
* - Create / edit a task description and ensure revisions are created on write
* - Open the history dialog and check that the revisions are correctly shown
* - Select a revision and check that the content / comparison are correct
* - Click the restore button and check that the content is correctly restored
*/
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
const baseDescriptionContent = "Test project task history version";
function changeDescriptionContentAndSave(newContent) {
const newText = `${baseDescriptionContent} ${newContent}`;
return [
{
// force focus on editable so editor will create initial p (if not yet done)
trigger: "div.note-editable.odoo-editor-editable",
run: "click",
},
{
trigger: `div.note-editable[spellcheck='true'].odoo-editor-editable`,
run: `editor ${newText}`,
},
...stepUtils.saveForm(),
];
}
function insertEditorContent(newContent) {
return [
{
// force focus on editable so editor will create initial p (if not yet done)
trigger: "div.note-editable.odoo-editor-editable",
run: "click",
},
{
trigger: `div.note-editable[spellcheck='true'].odoo-editor-editable`,
run: async function () {
// Insert content as html and make the field dirty
const div = document.createElement("div");
div.appendChild(document.createTextNode(newContent));
this.anchor.removeChild(this.anchor.firstChild);
this.anchor.appendChild(div);
this.anchor.dispatchEvent(new Event("input", { bubbles: true }));
},
},
];
}
registry.category("web_tour.tours").add("project_task_history_tour", {
url: "/odoo?debug=1,tests",
steps: () => [stepUtils.showAppsMenuItem(), {
content: "Open the project app",
trigger: ".o_app[data-menu-xmlid='project.menu_main_pm']",
run: "click",
},
{
content: "Open Test History Project",
trigger: ".o_kanban_view .o_kanban_record:contains(Test History Project)",
run: "click",
},
{
content: "Open Test History Task",
trigger: ".o_kanban_view .o_kanban_record:contains(Test History Task)",
run: "click",
},
// edit the description content 3 times and save after each edit
...changeDescriptionContentAndSave("0"),
...changeDescriptionContentAndSave("1"),
...changeDescriptionContentAndSave("2"),
...changeDescriptionContentAndSave("3"),
{
content: "Go back to kanban view of tasks. this step is added because it takes some time to save the changes, so it's a sort of timeout to wait a bit for the save",
trigger: ".o_back_button a",
run: "click",
},
{
content: "Open Test History Task",
trigger: ".o_kanban_view .o_kanban_record:contains(Test History Task)",
run: "click",
},
{
content: "Open History Dialog",
trigger: ".o_form_view .o_cp_action_menus i.fa-cog",
run: "click",
},
{
trigger: ".dropdown-menu",
},
{
content: "Open History Dialog",
trigger: ".o_menu_item i.fa-history",
run: "click",
}, {
trigger: ".modal .html-history-dialog.html-history-loaded",
}, {
content: "Verify that 5 revisions are displayed (default empty description after the creation of the task + 3 edits + current version)",
trigger: ".modal .html-history-dialog .revision-list .btn",
run: function () {
const items = document.querySelectorAll(".revision-list .btn");
if (items.length !== 5) {
console.error("Expect 5 Revisions in the history dialog, got " + items.length);
}
},
}, {
content: "Verify that the active revision (revision 4) is related to the current version",
trigger: `.modal .history-container .history-content-view .history-view-inner:contains(${baseDescriptionContent} 3)`,
}, {
content: "Go to the third revision related to the second edit",
trigger: ".modal .html-history-dialog .revision-list .btn:nth-child(3)",
run: "click",
}, {
trigger: ".modal .html-history-dialog.html-history-loaded",
}, {
content: "Verify that the active revision is the one clicked in the previous step",
trigger: `.modal .history-container .history-content-view .history-view-inner:contains(${baseDescriptionContent} 1)`,
}, {
// click on the comparison tab
trigger: '.history-container .history-view-top-bar a:contains(Comparison)',
run: "click",
}, {
content: "Verify comparison text",
trigger: ".modal .history-container .history-comparison-view",
run: function () {
const comparaisonHtml = this.anchor.innerHTML;
const correctHtml = `<added>${baseDescriptionContent} 3</added><removed>${baseDescriptionContent} 1</removed>`;
if (!comparaisonHtml.includes(correctHtml)) {
console.error(`Expect comparison to be ${correctHtml}, got ${comparaisonHtml}`);
}
},
}, {
trigger: ".modal .html-history-dialog.html-history-loaded",
}, {
content: "Click on Restore History btn to get back to the selected revision in the previous step",
trigger: ".modal button.btn-primary:enabled",
run: "click",
}, {
content: "Verify the confirmation dialog is opened",
trigger: ".modal button.btn-primary:text(Restore)",
run: "click",
}, {
content: "Verify that the description contains the right text after the restore",
trigger: `div.note-editable.odoo-editor-editable`,
run: function () {
const p = this.anchor?.innerText;
const expected = `${baseDescriptionContent} 1`;
if (p !== expected) {
console.error(`Expect description to be ${expected}, got ${p}`);
}
}
}, {
content: "Go back to projects view.",
trigger: 'a[data-menu-xmlid="project.menu_projects"]',
run: "click",
}, {
trigger: ".o_kanban_view",
}, {
content: "Open Test History Project Without Tasks",
trigger: ".o_kanban_view .o_kanban_record:contains(Without tasks project)",
run: "click",
}, {
trigger: ".o_kanban_project_tasks",
}, {
content: "Switch to list view",
trigger: ".o_switch_view.o_list",
run: "click",
}, {
content: "Create a new task.",
trigger: '.o_list_button_add',
run: "click",
}, {
trigger: ".o_form_view",
}, {
trigger: 'div[name="name"] .o_input',
content: 'Set task name',
run: 'edit New task',
},
...stepUtils.saveForm(),
...changeDescriptionContentAndSave("0"),
...changeDescriptionContentAndSave("1"),
...changeDescriptionContentAndSave("2"),
...changeDescriptionContentAndSave("3"),
{
trigger: ".o_form_view",
}, {
content: "Open History Dialog",
trigger: ".o_cp_action_menus i.fa-cog",
run: "click",
}, {
trigger: ".dropdown-menu",
}, {
content: "Open History Dialog",
trigger: ".o_menu_item i.fa-history",
run: "click",
}, {
content: "Close History Dialog",
trigger: ".modal-header .btn-close",
run: "click",
}, {
content: "Go back to projects view. this step is added because Tour can't be finished with an open form view in edition mode.",
trigger: 'a[data-menu-xmlid="project.menu_projects"]',
run: "click",
}, {
content: "Verify that we are on kanban view",
trigger: 'button.o_switch_view.o_kanban.active',
}
]});
registry.category("web_tour.tours").add("project_task_last_history_steps_tour", {
url: "/odoo?debug=1,tests",
steps: () => [stepUtils.showAppsMenuItem(), {
content: "Open the project app",
trigger: ".o_app[data-menu-xmlid='project.menu_main_pm']",
run: "click",
},
{
content: "Open Test History Project",
trigger: ".o_kanban_view .o_kanban_record:contains(Test History Project)",
run: "click",
},
{
content: "Open Test History Task",
trigger: ".o_kanban_view .o_kanban_record:contains(Test History Task)",
run: "click",
},
...insertEditorContent("0"),
...stepUtils.saveForm(),
{
content: "Open History Dialog",
trigger: ".o_cp_action_menus i.fa-cog",
run: "click",
}, {
trigger: ".dropdown-menu",
}, {
content: "Open History Dialog",
trigger: ".o_menu_item i.fa-history",
run: "click",
}, {
trigger: ".modal .html-history-dialog.html-history-loaded",
}, {
content: "Verify that 2 revisions are displayed",
trigger: ".modal .html-history-dialog .revision-list .btn",
run: function () {
const items = document.querySelectorAll(".revision-list .btn");
if (items.length !== 2) {
console.error("Expect 2 Revisions in the history dialog, got " + items.length);
}
},
}, {
content: "Go to the second revision related to the initial blank document ",
trigger: ".modal .html-history-dialog .revision-list .btn:nth-child(2)",
run: "click",
}, {
trigger: ".modal .html-history-dialog.html-history-loaded",
}, {
trigger: '.modal button.btn-primary:enabled',
run: "click",
}, {
trigger: '.modal button.btn-primary:text(Restore)',
run: "click",
},
...insertEditorContent("2"),
...stepUtils.saveForm(),
...insertEditorContent("4"),
{
trigger: ".o_notebook_headers li:nth-of-type(2) a",
run: "click",
},
{
trigger: ".o_notebook_headers li:nth-of-type(1) a",
run: "click",
},
...insertEditorContent("5"),
...stepUtils.saveForm(),
],
});

View file

@ -0,0 +1,47 @@
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
registry.category("web_tour.tours").add("project_task_templates_tour", {
url: "/odoo",
steps: () => [
stepUtils.showAppsMenuItem(),
{
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
run: "click",
},
{
trigger: '.o_kanban_record span:contains("Project with Task Template")',
run: "click",
content: "Navigate to the project with a task template",
},
{
trigger: 'div.o_last_breadcrumb_item span:contains("Project with Task Template")',
content: "Wait for the kanban view to load",
},
{
trigger: ".o-kanban-button-new",
run: "click",
},
{
trigger: '.dropdown-menu button.dropdown-item:contains("Template")',
run: "click",
content: "Create a task with the template",
},
{
trigger: 'div[name="name"] .o_input',
run: "edit Task",
},
{
trigger: "button.o_form_button_save",
run: "click",
},
{
content: "Wait for save completion",
trigger: ".o_form_readonly, .o_form_saved",
},
{
trigger: 'div.note-editable.odoo-editor-editable:contains("Template description")',
content: "Check that the created task has copied the description of the template",
},
],
});

View file

@ -0,0 +1,72 @@
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
registry.category("web_tour.tours").add("project_templates_tour", {
url: "/odoo",
steps: () => [
stepUtils.showAppsMenuItem(),
{
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
run: "click",
},
{
content: "Click on New Button of Kanban view",
trigger: ".o-kanban-button-new",
run: "click",
},
{
trigger: '.dropdown-menu button.dropdown-item:contains("Project Template")',
run: "click",
content: "Create a project from the template",
},
{
trigger: '.modal div[name="name"] .o_input',
run: "edit New Project",
},
{
trigger: 'button[name="create_project_from_template"]',
run: "click",
},
{
content: "Go back to kanban view",
trigger: ".breadcrumb-item a:contains('Projects')",
run: "click",
},
{
content: "Check for created project",
trigger: ".o_kanban_record:contains('New Project')",
},
{
content: "Go to list view",
trigger: "button.o_switch_view.o_list",
run: "click",
},
{
content: "Click on New Button of List view",
trigger: ".o_list_button_add",
run: "click",
},
{
content: "Lets Create a second project from the template",
trigger: '.dropdown-menu button.dropdown-item:contains("Project Template")',
run: "click",
},
{
trigger: '.modal div[name="name"] .o_input',
run: "edit New Project 2",
},
{
trigger: 'button[name="create_project_from_template"]',
run: "click",
},
{
content: "Go back to list view",
trigger: ".breadcrumb-item a:contains('Projects')",
run: "click",
},
{
content: "Check for created project",
trigger: ".o_data_row td[name='name']:contains('New Project 2')",
},
],
});

View file

@ -0,0 +1,158 @@
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
registry.category("web_tour.tours").add('project_test_tour', {
url: '/odoo',
steps: () => [
stepUtils.showAppsMenuItem(), {
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
run: "click",
},
{
trigger: '.o_project_kanban',
},
{
trigger: '.o-kanban-button-new',
run: "click",
}, {
isActive: ['.o-kanban-button-new.dropdown'], // if the project template dropdown is active
trigger: 'button.o-dropdown-item:contains("New Project")',
run: "click",
}, {
trigger: '.o_project_name input',
run: 'edit New Project',
id: 'project_creation',
}, {
trigger: '.o_open_tasks',
run: "click .modal:visible .btn.btn-primary",
}, {
trigger: ".o_kanban_project_tasks .o_column_quick_create .input-group input",
run: "edit New",
}, {
isActive: ["auto"],
trigger: ".o_kanban_project_tasks .o_column_quick_create .o_kanban_add",
run: "click",
},
{
trigger: ".o_kanban_group",
},
{
trigger: ".o_kanban_project_tasks .o_column_quick_create .input-group input",
run: "edit Done",
}, {
isActive: ["auto"],
trigger: ".o_kanban_project_tasks .o_column_quick_create .o_kanban_add",
run: "click",
},
{
trigger: ".o_kanban_group:eq(0)",
},
{
trigger: '.o-kanban-button-new',
run: "click",
},
{
trigger: ".o_kanban_project_tasks",
},
{
trigger: '.o_kanban_quick_create div.o_field_char[name=display_name] input',
run: "edit New task",
}, {
trigger: '.o_kanban_quick_create .o_kanban_add',
run: "click",
}, {
trigger: '.o_kanban_record span:contains("New task")',
run: "click",
}, {
trigger: 'a[name="sub_tasks_page"]',
content: 'Open sub-tasks notebook section',
run: 'click',
}, {
trigger: '.o_field_subtasks_one2many .o_list_renderer a[role="button"]',
content: 'Add a subtask',
run: 'click',
}, {
trigger: '.o_field_subtasks_one2many div[name="name"] input',
content: 'Set subtask name',
run: "edit new subtask",
}, {
trigger: ".o_breadcrumb .o_back_button",
content: 'Go back to kanban view',
tooltipPosition: "right",
run: "click",
}, {
trigger: ".o_kanban_record .o_widget_subtask_counter .subtask_list_button",
content: 'open sub-tasks from kanban card',
run: "click",
},
{
trigger: ".o_widget_subtask_kanban_list .subtask_list",
},
{
trigger: ".o_kanban_record .o_widget_subtask_kanban_list .subtask_create",
content: 'Create a new sub-task',
run: "click",
},
{
trigger: ".subtask_create_input",
},
{
trigger: ".o_kanban_record .o_widget_subtask_kanban_list .subtask_create_input input",
content: 'Give the sub-task a name',
run: "edit newer subtask && press Tab",
},
{
content: "wait the new record is created",
trigger: ".o_kanban_record .o_widget_subtask_kanban_list a:contains(newer subtask)",
},
{
trigger: ".o_kanban_record .o_widget_subtask_kanban_list .subtask_list_row:first-child .o_field_project_task_state_selection button",
content: 'Change the subtask state',
run: "click",
},
{
trigger: ".dropdown-menu",
},
{
trigger: ".dropdown-menu span.text-danger",
content: 'Mark the task as Canceled',
run: "click",
}, {
trigger: ".o_kanban_record .o_widget_subtask_counter .subtask_list_button:contains('1/2')",
content: 'Close the sub-tasks list',
id: "quick_create_tasks",
run: "click",
}, {
trigger: '.o_field_text[name="name"] textarea',
content: 'Set task name',
run: "edit New task",
}, {
trigger: 'div[name="user_ids"].o_field_many2many_tags_avatar input',
content: 'Assign the task to you',
run: 'click',
}, {
trigger: 'ul.ui-autocomplete a .o_avatar_many2x_autocomplete',
content: 'Assign the task to you',
run: "click",
}, {
trigger: 'a[name="sub_tasks_page"]',
content: 'Open sub-tasks notebook section',
run: 'click',
}, {
trigger: '.o_field_subtasks_one2many .o_list_renderer a[role="button"]',
content: 'Add a subtask',
run: 'click',
}, {
trigger: '.o_field_subtasks_one2many div[name="name"] input',
content: 'Set subtask name',
run: "edit new subtask",
},
{
trigger: '.o_field_many2many_tags_avatar .o_m2m_avatar',
},
{
trigger: 'button[special="save"]',
content: 'Save task',
run: "click",
},
]});

View file

@ -1,180 +1,222 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
import tour from 'web_tour.tour';
function openProjectUpdateAndReturnToTasks(view, viewClass) {
const legacyViewClass = viewClass.replace("o_", "o_legacy_");
return [{
trigger: '.o_project_updates_breadcrumb',
content: 'Open Project Update from view : ' + view,
extra_trigger: `.${viewClass}, .${legacyViewClass}`,
}, {
trigger: ".o-kanban-button-new",
content: "Create a new update from project task view : " + view,
extra_trigger: '.o_pupdate_kanban',
}, {
trigger: "button.o_form_button_cancel",
content: "Discard project update from project task view : " + view,
}, {
trigger: ".o_switch_view.o_list",
content: "Go to list of project update from view " + view,
}, {
trigger: '.o_back_button',
content: 'Go back to the task view : ' + view,
// extra_trigger: '.o_list_view, .o_legacy_list_view', // FIXME: [XBO] uncomment it when the sample data will be displayed after discarding the creation of a project update record.
},
];
}
tour.register('project_update_tour', {
test: true,
url: '/web',
},
[tour.stepUtils.showAppsMenuItem(), {
registry.category("web_tour.tours").add('project_update_tour', {
url: '/odoo',
steps: () => [stepUtils.showAppsMenuItem(), {
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
}, {
run: "click",
},
{
trigger: ".o_project_kanban",
},
{
trigger: '.o-kanban-button-new',
extra_trigger: '.o_project_kanban',
width: 200,
run: "click",
}, {
isActive: ['.o-kanban-button-new.dropdown'], // if the project template dropdown is active
trigger: 'button.o-dropdown-item:contains("New Project")',
run: "click",
}, {
trigger: '.o_project_name input',
run: 'text New Project'
run: "edit New Project",
}, {
trigger: '.o_open_tasks',
run: function (actions) {
actions.auto('.modal:visible .btn.btn-primary');
},
run: "click .modal:visible .btn.btn-primary",
}, {
trigger: ".o_kanban_project_tasks .o_column_quick_create .input-group",
run: function (actions) {
actions.text("New", this.$anchor.find("input"));
},
trigger: ".o_kanban_project_tasks .o_column_quick_create .input-group input",
run: "edit New",
}, {
isActive: ["auto"],
trigger: ".o_kanban_project_tasks .o_column_quick_create .o_kanban_add",
auto: true,
}, {
trigger: ".o_kanban_project_tasks .o_column_quick_create .input-group",
extra_trigger: '.o_kanban_group',
run: function (actions) {
actions.text("Done", this.$anchor.find("input"));
},
run: "click",
},
{
trigger: ".o_kanban_group",
},
{
trigger: ".o_kanban_project_tasks .o_column_quick_create .input-group input",
run: "edit Done",
}, {
isActive: ["auto"],
trigger: ".o_kanban_project_tasks .o_column_quick_create .o_kanban_add",
auto: true,
}, {
run: "click",
},
{
trigger: ".o_kanban_group:eq(0)",
},
{
trigger: '.o-kanban-button-new',
extra_trigger: '.o_kanban_group:eq(0)'
}, {
trigger: '.o_kanban_quick_create div.o_field_char[name=name] input',
extra_trigger: '.o_kanban_project_tasks',
run: 'text New task'
}, {
run: "click",
},
{
trigger: ".o_kanban_project_tasks",
},
{
trigger: '.o_kanban_quick_create div.o_field_char[name=display_name] input',
run: "edit New task",
},
{
trigger: ".o_kanban_project_tasks",
},
{
trigger: '.o_kanban_quick_create .o_kanban_add',
extra_trigger: '.o_kanban_project_tasks'
}, {
run: "click",
},
{
trigger: ".o_kanban_group:eq(0)",
},
{
trigger: '.o-kanban-button-new',
extra_trigger: '.o_kanban_group:eq(0)'
}, {
trigger: '.o_kanban_quick_create div.o_field_char[name=name] input',
extra_trigger: '.o_kanban_project_tasks',
run: 'text Second task'
}, {
run: "click",
},
{
trigger: ".o_kanban_project_tasks",
},
{
trigger: '.o_kanban_quick_create div.o_field_char[name=display_name] input',
run: "edit Second task",
},
{
trigger: ".o_kanban_project_tasks",
},
{
trigger: '.o_kanban_quick_create .o_kanban_add',
extra_trigger: '.o_kanban_project_tasks'
run: "click",
}, {
trigger: '.o_kanban_group:nth-child(2) .o_kanban_header',
run: function () {
document.querySelector('.o_kanban_group:nth-child(2) .o_kanban_config.dropdown .dropdown-toggle').dispatchEvent(new Event('click'));
}
trigger: ".o_kanban_group:nth-child(2) .o_kanban_header",
run: "hover && click .o_kanban_group:nth-child(2) .o_kanban_header .dropdown-toggle",
}, {
trigger: ".dropdown-item.o_column_edit",
trigger: ".dropdown-item.o_group_edit",
run: "click",
}, {
trigger: ".o_field_widget[name=fold] input",
trigger: ".modal .o_field_widget[name=fold] input",
run: "click",
}, {
trigger: ".modal-footer button",
trigger: ".modal .modal-footer button",
run: "click",
},
{
trigger: "body:not(:has(.modal))",
},
{
trigger: '.o_kanban_project_tasks',
},
{
trigger: ".o_kanban_record",
run: "drag_and_drop(.o_kanban_group:eq(1))",
}, {
trigger: ".o_kanban_record .oe_kanban_content",
extra_trigger: '.o_kanban_project_tasks',
run: "drag_and_drop .o_kanban_group:eq(1) ",
trigger: ".breadcrumb-item.o_back_button",
run: "click",
}, {
trigger: ".o_project_updates_breadcrumb",
content: 'Open Updates'
trigger: ".o_kanban_record:contains('New Project')",
}, {
trigger: ".o_switch_view.o_list",
run: "click",
}, {
trigger: "tr.o_data_row td[name='name']:contains('New Project')",
run: "click",
}, {
trigger: ".nav-link:contains('Settings')",
run: "click",
}, {
trigger: "div[name='allow_milestones'] input",
run: "click",
}, {
trigger: ".o_form_button_save",
run: "click",
}, {
trigger: "button[name='action_view_tasks']",
run: "click",
}, {
trigger: ".o_control_panel_navigation button i.fa-sliders",
content: 'Open embedded actions',
run: "click",
}, {
trigger: "span.o-dropdown-item:contains('Top Menu')",
run: "click",
}, {
trigger: ".o-dropdown-item div span:contains('Dashboard')",
content: "Put Dashboard in the embedded actions",
run: "click",
}, {
trigger: ".o_embedded_actions button span:contains('Dashboard')",
content: "Open Dashboard",
run: "click",
}, {
trigger: ".o_add_milestone a",
content: "Add a first milestone"
content: "Add a first milestone",
run: "click",
}, {
trigger: ".o_list_button_add",
content: "Create new milestone",
run: "click",
}, {
trigger: "div.o_field_widget[name=name] input",
run: 'text New milestone'
run: "edit New milestone",
}, {
trigger: "div[name=deadline] .datetimepicker-input",
run: 'text 12/12/2099'
trigger: "input[data-field=deadline]",
run: "edit 12/12/2099",
}, {
trigger: ".modal-footer .o_form_button_save"
trigger: ".o_list_button_save",
run: "click",
}, {
trigger: ".o_add_milestone a",
trigger: ".o_list_button_add",
content: "Make sure the milestone is saved before continuing",
}, {
trigger: "td[data-tooltip='New milestone'] + td",
run: "click",
}, {
trigger: "input[data-field=deadline]",
run: "edit 12/12/2100 && click body"
}, {
trigger: ".o_list_button_add",
content: "Create new milestone",
run: "click",
}, {
trigger: "div.o_field_widget[name=name] input",
run: 'text Second milestone'
run: "edit Second milestone",
}, {
trigger: "div[name=deadline] .datetimepicker-input",
run: 'text 12/12/2022'
trigger: "input[data-field=deadline]",
run: "edit 12/12/2022 && click body",
}, {
trigger: ".modal-footer .o_form_button_save"
}, {
trigger: ".o_rightpanel_milestone:eq(1) .o_milestone_detail",
}, {
trigger: "div[name=deadline] .datetimepicker-input",
run: 'text 12/12/2100'
}, {
trigger: ".modal-footer .o_form_button_save"
trigger: ".breadcrumb-item.o_back_button",
run: "click",
}, {
trigger: ".o-kanban-button-new",
content: "Create a new update"
content: "Create a new update",
run: "click",
}, {
trigger: "div.o_field_widget[name=name] input",
run: 'text New update'
run: "edit New update",
}, {
trigger: ".o_form_button_save"
trigger: ".o_form_button_save",
run: "click",
}, {
trigger: ".o_field_widget[name='description'] h1:contains('Activities')",
run: function () {},
}, {
trigger: ".o_field_widget[name='description'] h3:contains('Milestones')",
run: function () {},
}, {
trigger: ".o_field_widget[name='description'] div[name='milestone'] ul li:contains('(12/12/2099 => 12/12/2100)')",
run: function () {},
}, {
trigger: ".o_field_widget[name='description'] div[name='milestone'] ul li:contains('(due 12/12/2022)')",
run: function () {},
}, {
trigger: ".o_field_widget[name='description'] div[name='milestone'] ul li:contains('(due 12/12/2100)')",
run: function () {},
}, {
trigger: '.o_back_button',
content: 'Go back to the kanban view the project',
run: "click",
}, {
trigger: '.o_switch_view.o_list',
content: 'Open List View of Project Updates',
}, {
content: 'Open List View of Dashboard',
run: "click",
},
{
trigger: '.o_list_view',
},
{
trigger: '.o_back_button',
content: 'Go back to the kanban view the project',
extra_trigger: '.o_list_view, .o_legacy_list_view',
}, {
trigger: '.o_switch_view.o_graph',
content: 'Open Graph View of Tasks',
}, ...openProjectUpdateAndReturnToTasks("Graph", "o_graph_view"), {
trigger: '.o_switch_view.o_list',
content: 'Open List View of Tasks',
extra_trigger: '.o_graph_view',
}, ...openProjectUpdateAndReturnToTasks("List", "o_list_view"), {
trigger: '.o_switch_view.o_pivot',
content: 'Open Pivot View of Tasks',
}, ...openProjectUpdateAndReturnToTasks("Pivot", "o_pivot_view"), {
trigger: '.o_switch_view.o_calendar',
content: 'Open Calendar View of Tasks',
}, ...openProjectUpdateAndReturnToTasks("Calendar", "o_calendar_view"), {
trigger: '.o_switch_view.o_activity',
content: 'Open Activity View of Tasks',
}, ...openProjectUpdateAndReturnToTasks("Activity", "o_activity_view"),
]);
run: "click",
},
]});