[IMP] test_main_flows: adapt The Main Flow Tour to be usable on mobile
This commit adapts some existing steps or add new ones to execute the same tour on mobile. This tour has many steps and give a good idea to know if new tasks broke mobile or not. The goal is that even if the design isn't perfect, users aren't blocked and are able to perform their usual tasks. Task ID: 2149402
This commit is contained in:
committed by
Adrien Dieudonne
parent
ab2e3fdb7d
commit
8ff16b2128
@@ -7,17 +7,10 @@ const tour = require('web_tour.tour');
|
||||
tour.register('main_flow_tour', {
|
||||
test: true,
|
||||
url: "/web",
|
||||
}, [tour.stepUtils.showAppsMenuItem(), {
|
||||
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]',
|
||||
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
|
||||
position: 'right',
|
||||
edition: 'community'
|
||||
}, {
|
||||
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]',
|
||||
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
|
||||
position: 'bottom',
|
||||
edition: 'enterprise'
|
||||
}, {
|
||||
}, [
|
||||
...tour.stepUtils.goToAppSteps('sale.sale_menu_root', _t('Organize your sales activities with the <b>Sales app</b>.')),
|
||||
tour.stepUtils.openBuggerMenu("li.breadcrumb-item.active:contains('Quotations')"),
|
||||
{
|
||||
// Add Stockable product
|
||||
trigger: ".o_menu_sections a:contains('Products')",
|
||||
extra_trigger: '.o_main_navbar',
|
||||
@@ -29,7 +22,7 @@ tour.register('main_flow_tour', {
|
||||
position: "bottom"
|
||||
}, {
|
||||
trigger: '.o-kanban-button-new',
|
||||
extra_trigger: '.o_kanban_view',
|
||||
extra_trigger: "li.breadcrumb-item.active:contains('Products')",
|
||||
content: _t("Let's create your first product."),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
@@ -64,6 +57,7 @@ tour.register('main_flow_tour', {
|
||||
content: _t('Go to main tab'),
|
||||
position: 'top',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=taxes_id] input",
|
||||
content: _t("Focus on customer taxes field."),
|
||||
run: function (actions) {
|
||||
@@ -79,18 +73,9 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_form_button_save',
|
||||
content: _t("Save this product and the modifications you've made to it."),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".oe_button_box",
|
||||
extra_trigger: '.o_form_readonly',
|
||||
auto: true,
|
||||
run: function (actions) {
|
||||
// auto expand "More" buttons
|
||||
const $more = $(".oe_button_box .o_button_more");
|
||||
if ($more.length) {
|
||||
actions.click($more);
|
||||
}
|
||||
},
|
||||
}, {
|
||||
},
|
||||
tour.stepUtils.autoExpandMoreButtons('.o_form_readonly'),
|
||||
{
|
||||
trigger: ".oe_button_box .oe_stat_button:has(div[name=bom_count])",
|
||||
extra_trigger: '.o_form_readonly',
|
||||
content: _t('See Bill of material'),
|
||||
@@ -101,20 +86,41 @@ tour.register('main_flow_tour', {
|
||||
position: "bottom",
|
||||
}, {
|
||||
// Add first component
|
||||
// FIXME in mobile replace list by kanban + form
|
||||
trigger: ".o_field_x2many_list_row_add > a",
|
||||
extra_trigger: ".o_form_editable",
|
||||
content: _t("Click here to add some lines."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_selected_row .o_required_modifier[name=product_id] input",
|
||||
content: _t("Select a product, or create a new one on the fly."),
|
||||
position: "right",
|
||||
run: "text the_flow.component1",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.component1')",
|
||||
auto: true,
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_selected_row .o_required_modifier[name=product_id] input",
|
||||
content: _t("Click here to open kanban search mobile."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-dialog .btn:contains('Create')",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t("Click here to add new line."),
|
||||
position: "left",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.modal-body .o_form_editable .o_field_widget.o_input[name="name"]',
|
||||
content: _t("Select a product, or create a new one on the fly."),
|
||||
position: "right",
|
||||
run: "text the_flow.component1",
|
||||
}, {
|
||||
// Edit first component
|
||||
mobile: false,
|
||||
trigger: ".o_selected_row .o_external_button",
|
||||
content: _t("Click here to edit your component"),
|
||||
position: "right",
|
||||
@@ -131,48 +137,127 @@ tour.register('main_flow_tour', {
|
||||
content: _t('Go to purchase tab'),
|
||||
position: 'top',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=seller_ids] .o_field_x2many_list_row_add > a",
|
||||
content: _t("Let's enter the cost price"),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=name] input",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t('Select a seller'),
|
||||
position: 'top',
|
||||
run: "text the_flow.vendor",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.vendor')",
|
||||
in_modal: false,
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_widget[name=seller_ids] .o-kanban-button-new",
|
||||
content: _t("Let's select a vendor"),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_form_editable .o_field_many2one[name=name] input",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .o_form_editable div:contains('Vendor')",
|
||||
content: _t("Select a vendor, or create a new one on the fly."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn:contains('Create')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Vendor')",
|
||||
content: _t("Select a vendor, or create a new one on the fly."),
|
||||
position: "right",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-dialog .o_field_widget[name=name] input",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-dialog .o_field_radio.o_field_widget[name=company_type]",
|
||||
content: _t('Select a seller'),
|
||||
position: 'top',
|
||||
run: "text the_flow.vendor",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.btn:has(:contains(Save))',
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Vendor')",
|
||||
content: _t("Save this product and the modifications you've made to it."),
|
||||
position: 'right',
|
||||
}, {
|
||||
trigger: ".o_field_widget[name=price]",
|
||||
content: _t('Set the cost price'),
|
||||
position: 'right',
|
||||
run: "text 1",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save & Close')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Vendor')",
|
||||
content: _t('Save & Close'),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Component')",
|
||||
content: _t('Save'),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_field_widget[name=code]',
|
||||
extra_trigger: ".o_field_widget[name=product_id] > .o_external_button", // Wait name_create
|
||||
// click somewhere else to exit cell focus
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: 'label:contains("Vendor Taxes")',
|
||||
extra_trigger: ".o_field_widget[name=name] > .o_external_button", // Wait name_create
|
||||
// click somewhere else to exit cell focus
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".modal-footer .btn-primary",
|
||||
content: _t('Save'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
// Add second component
|
||||
mobile: false,
|
||||
trigger: ".o_field_x2many_list_row_add > a",
|
||||
extra_trigger: "body:not(:has(table.o_list_table div.o_field_widget[name='product_id'] input))",
|
||||
content: _t("Click here to add some lines."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_x2many_list_row_add > a",
|
||||
extra_trigger: ".o_form_editable",
|
||||
content: _t("Click here to add some lines."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_selected_row .o_required_modifier[name=product_id] input",
|
||||
content: _t("Click here to open kanban search mobile."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-dialog .btn:contains('Create')",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t("Click here to add new line."),
|
||||
position: "left",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-body .o_form_editable .o_field_widget.o_input[name=\"name\"]",
|
||||
content: _t("Select a product, or create a new one on the fly."),
|
||||
position: "right",
|
||||
run: "text the_flow.component2",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_selected_row .o_required_modifier[name=product_id] input",
|
||||
extra_trigger: '.o_field_widget[name=bom_line_ids] .o_data_row:nth(1).o_selected_row',
|
||||
content: _t("Select a product, or create a new one on the fly."),
|
||||
position: "right",
|
||||
run: "text the_flow.component2",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.component2')",
|
||||
auto: true,
|
||||
}, {
|
||||
// Edit second component
|
||||
mobile: false,
|
||||
trigger: ".o_selected_row .o_external_button",
|
||||
content: _t("Click here to edit your component"),
|
||||
position: "right",
|
||||
@@ -181,16 +266,32 @@ tour.register('main_flow_tour', {
|
||||
content: _t('Go to purchase tab'),
|
||||
position: 'top',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_widget[name=seller_ids] .o-kanban-button-new",
|
||||
content: _t("Let's select a vendor"),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_form_editable .o_field_many2one[name="name"] input',
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .o_form_editable div:contains('Vendor')",
|
||||
content: _t("Select a vendor, or create a new one on the fly."),
|
||||
position: "bottom",
|
||||
},
|
||||
...tour.stepUtils.mobileKanbanSearchMany2X('Vendor', 'the_flow.vendor'),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=seller_ids] .o_field_x2many_list_row_add > a",
|
||||
content: _t("Let's enter the cost price"),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=name] input",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t('Select a seller'),
|
||||
position: 'top',
|
||||
run: "text the_flow.vendor",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.vendor')",
|
||||
auto: true,
|
||||
in_modal: false,
|
||||
@@ -200,9 +301,28 @@ tour.register('main_flow_tour', {
|
||||
position: 'right',
|
||||
run: "text 1",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save & Close')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Vendor')",
|
||||
content: _t('Save & Close'),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Component')",
|
||||
content: _t('Save'),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_field_widget[name=code]',
|
||||
extra_trigger: ".o_field_widget[name=product_id] > .o_external_button", // Wait name_create
|
||||
// click somewhere else to exit cell focus
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: 'label:contains("Vendor Taxes")',
|
||||
// click somewhere else to exit cell focus
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".modal-footer .btn-primary",
|
||||
extra_trigger: ".o_field_widget[name=seller_ids] .o_data_row td:nth-child(2):contains('the_flow.vendor')",
|
||||
content: _t('Save'),
|
||||
@@ -213,10 +333,18 @@ tour.register('main_flow_tour', {
|
||||
content: _t('Save the bom.'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".breadcrumb-item:first",
|
||||
content: _t("Use the breadcrumbs to <b>go back to products</b>."),
|
||||
position: "bottom"
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goBackBreadcrumbsMobile(
|
||||
_t("Use the breadcrumbs to <b>go back to products</b>."),
|
||||
undefined,
|
||||
".breadcrumb-item.active:contains('Bill of Materials')",
|
||||
".breadcrumb-item.active:contains('the_flow.product')"
|
||||
),
|
||||
{
|
||||
// Add service product
|
||||
trigger: '.o-kanban-button-new',
|
||||
extra_trigger: '.o_kanban_view',
|
||||
@@ -234,6 +362,7 @@ tour.register('main_flow_tour', {
|
||||
position: 'left',
|
||||
run: 'text "service"',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=taxes_id] input",
|
||||
content: _t("Focus on customer taxes field."),
|
||||
run: function (actions) {
|
||||
@@ -258,13 +387,39 @@ tour.register('main_flow_tour', {
|
||||
content: _t('Change track service'),
|
||||
position: 'left',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: '.o_field_widget[name=project_id] input',
|
||||
content: _t('Choose project'),
|
||||
position: 'left',
|
||||
run: 'text the_flow.project',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_field_widget[name=project_id] input',
|
||||
content: _t('Choose project'),
|
||||
position: 'left',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-dialog .btn:contains('Create')",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t("Click here to add new line."),
|
||||
position: "left",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: 'input[name=name]',
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Project')",
|
||||
content: _t('Let\'s enter the name.'),
|
||||
position: 'left',
|
||||
run: 'text the_flow.project',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.project')",
|
||||
auto: true,
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Project')",
|
||||
content: _t('Save'),
|
||||
position: 'right',
|
||||
}, {
|
||||
trigger: '.o_form_button_save',
|
||||
extra_trigger: '.o_field_widget[name=project_id] > .o_external_button', // Wait name_create
|
||||
@@ -276,17 +431,9 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_menu_toggle',
|
||||
content: _t('Go back to the home menu'),
|
||||
position: 'bottom',
|
||||
}, tour.stepUtils.showAppsMenuItem(), {
|
||||
trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"]',
|
||||
content: _t('Organize your sales activities with the <b>CRM app</b>.'),
|
||||
position: 'right',
|
||||
edition: 'community'
|
||||
}, {
|
||||
trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"]',
|
||||
content: _t('Organize your sales activities with the <b>CRM app</b>.'),
|
||||
position: 'bottom',
|
||||
edition: 'enterprise'
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goToAppSteps('crm.crm_menu_root', _t('Organize your sales activities with the <b>CRM app</b>.')),
|
||||
{
|
||||
trigger: ".o-kanban-button-new",
|
||||
extra_trigger: '.o_opportunity_kanban',
|
||||
content: _t("Click here to <b>create your first opportunity</b> and add it to your pipeline."),
|
||||
@@ -297,42 +444,90 @@ tour.register('main_flow_tour', {
|
||||
position: "right",
|
||||
run: "text the_flow.opportunity",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_kanban_quick_create .o_field_widget[name=partner_id] input",
|
||||
content: _t("Write the name of your customer to create one on the fly, or select an existing one."),
|
||||
position: "left",
|
||||
run: "text the_flow.customer",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_kanban_quick_create .o_field_widget[name=partner_id] input",
|
||||
content: _t("Write the name of your customer to create one on the fly, or select an existing one."),
|
||||
position: "left",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-dialog .btn:contains('Create')",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t("Click here to add new line."),
|
||||
position: "left",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_field_widget[name=name] input',
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Customer')",
|
||||
content: _t('Let\'s enter the name.'),
|
||||
position: 'left',
|
||||
run: 'text the_flow.customer',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.customer')",
|
||||
auto: true,
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Customer')",
|
||||
content: _t('Save'),
|
||||
position: 'right',
|
||||
}, {
|
||||
trigger: ".o_kanban_quick_create .o_kanban_add",
|
||||
extra_trigger: ".o_kanban_quick_create .o_field_widget[name=partner_id] > .o_external_button", // Wait name_create
|
||||
content: _t("Click here to <b>add your opportunity</b>."),
|
||||
position: "right",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_kanban_group:first .o_kanban_record:has(span:contains('the_flow.opportunity'))",
|
||||
content: _t("<b>Drag & drop opportunities</b> between columns as you progress in your sales cycle."),
|
||||
position: "right",
|
||||
run: "drag_and_drop .o_opportunity_kanban .o_kanban_group:eq(2) ",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_kanban_group:eq(2) > .o_kanban_record:has(span:contains('the_flow.opportunity'))",
|
||||
content: _t("Click on an opportunity to zoom to it."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
// Create a quotation
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('New Quotation')",
|
||||
content: _t('<p><b>Create a quotation</p>'),
|
||||
position: "right"
|
||||
mobile: true,
|
||||
trigger: ".o_kanban_group:first .o_kanban_record:has(span:contains('the_flow.opportunity'))",
|
||||
content: _t("Open the_flow.opportunity"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_statusbar_status .btn.dropdown-toggle:contains(New)",
|
||||
content: _t("Change status from New to proposition."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_statusbar_status .btn:contains(Proposition)",
|
||||
content: _t("Change status from New to proposition."),
|
||||
position: "bottom",
|
||||
},
|
||||
// Create a quotation
|
||||
...tour.stepUtils.statusbarButtonsSteps('New Quotation', _t('<p><b>Create a quotation</p>')),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=order_line] .o_field_x2many_list_row_add > a",
|
||||
content: _t("Click here to add some lines to your quotations."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_widget[name=order_line] .btn:contains(Add)",
|
||||
content: _t("Click here to add some lines to your quotations."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
/**
|
||||
* We need both triggers because the "sale_product_configurator" module replaces the
|
||||
* "product_id" field with a "product_template_id" field.
|
||||
* This selector will still only ever select one element.
|
||||
*/
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=product_id] input, .o_field_widget[name=product_template_id] input",
|
||||
content: _t("Select a product, or create a new one on the fly. The product will define the default sales price (that you can change), taxes and description automatically."),
|
||||
position: "right",
|
||||
@@ -351,20 +546,38 @@ tour.register('main_flow_tour', {
|
||||
});
|
||||
},
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.product')",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: '.o_form_editable textarea[name="name"].product_loading_success',
|
||||
run: function () {} // wait for product loading
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_widget[name=product_id] input",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Order Lines')",
|
||||
content: _t("Select a product, or create a new one on the fly. The product will define the default sales price (that you can change), taxes and description automatically."),
|
||||
position: "right",
|
||||
},
|
||||
...tour.stepUtils.mobileKanbanSearchMany2X('Product', 'the_flow.product'),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=order_line] .o_field_x2many_list_row_add > a",
|
||||
content: _t("Click here to add some lines to your quotations."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save & New')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Order Lines')",
|
||||
content: _t('Save & New'),
|
||||
position: 'right',
|
||||
}, {
|
||||
/**
|
||||
* We need both triggers because the "sale_product_configurator" module replaces the
|
||||
* "product_id" field with a "product_template_id" field.
|
||||
* This selector will still only ever select one element.
|
||||
*/
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=product_id] input, .o_field_widget[name=product_template_id] input",
|
||||
extra_trigger: '.o_field_widget[name=order_line] .o_data_row:nth(1).o_selected_row',
|
||||
content: _t("Select a product"),
|
||||
@@ -384,19 +597,33 @@ tour.register('main_flow_tour', {
|
||||
});
|
||||
},
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.service')",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: '.o_form_editable textarea[name="name"].product_service_loading_success',
|
||||
run: function () {} // wait for product loading
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: 'label:contains("Untaxed Amount")',
|
||||
// click somewhere else to exit cell focus
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Send by Email')",
|
||||
extra_trigger: ".o_statusbar_status .btn-primary:contains('Quotation')",
|
||||
content: _t("Try to send it to email"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_widget[name=product_id] input",
|
||||
extra_trigger: '.o_field_x2many_kanban[name=order_line] .oe_kanban_card:contains(the_flow.product)',
|
||||
content: _t("Select a product, or create a new one on the fly. The product will define the default sales price (that you can change), taxes and description automatically."),
|
||||
position: "right",
|
||||
},
|
||||
...tour.stepUtils.mobileKanbanSearchMany2X('Product', 'the_flow.service'),
|
||||
{
|
||||
mobile: true,
|
||||
trigger: ".modal-footer .btn-primary:contains('Save & Close')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Order Lines')",
|
||||
content: _t('Save & Close'),
|
||||
position: 'right',
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Send by Email', _t("Try to send it to email"), ".o_statusbar_status .btn-primary:contains('Quotation')"),
|
||||
{
|
||||
trigger: ".o_field_widget[name=email]",
|
||||
content: _t("Enter an email address"),
|
||||
position: "right",
|
||||
@@ -409,11 +636,9 @@ tour.register('main_flow_tour', {
|
||||
trigger: ".modal-footer .btn-primary span:contains('Send')",
|
||||
content: _t("Try to send it to email"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Confirm')",
|
||||
content: _t("<p>Confirm this quotation</p>"),
|
||||
position: "bottom"
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Confirm', _t("<p>Confirm this quotation</p>")),
|
||||
{
|
||||
trigger: ".o_form_button_save",
|
||||
extra_trigger: ".o_statusbar_status .btn-primary:contains('Sales Order')",
|
||||
content: _t("<p>Save this quotation</p>"),
|
||||
@@ -424,18 +649,12 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_menu_toggle',
|
||||
content: _t('Go back to the home menu'),
|
||||
position: 'bottom',
|
||||
}, tour.stepUtils.showAppsMenuItem(), {
|
||||
trigger: '.o_app[data-menu-xmlid="stock.menu_stock_root"]',
|
||||
content: _t('Go to Inventory'),
|
||||
position: 'right',
|
||||
edition: 'community'
|
||||
}, {
|
||||
trigger: '.o_app[data-menu-xmlid="stock.menu_stock_root"]',
|
||||
content: _t('Go to Inventory'),
|
||||
position: 'bottom',
|
||||
edition: 'enterprise'
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goToAppSteps('stock.menu_stock_root', _t('Go to Inventory')),
|
||||
tour.stepUtils.openBuggerMenu("li.breadcrumb-item.active:contains('Inventory Overview')"),
|
||||
{
|
||||
trigger: ".o_menu_sections a:contains('Master Data')",
|
||||
extra_trigger: '.o_main_navbar',
|
||||
content: _t("Go to Master Data"),
|
||||
position: "bottom"
|
||||
}, {
|
||||
@@ -443,18 +662,33 @@ tour.register('main_flow_tour', {
|
||||
content: _t("Reordering Rules"),
|
||||
position: "bottom"
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_list_button_add",
|
||||
content: _t("Let's create a new reordering rule"),
|
||||
position: "right",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o-kanban-button-new",
|
||||
content: _t("Let's create a new reordering rule"),
|
||||
position: "right",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_field_widget[name=product_id] input",
|
||||
content: _t("Write the name of your product."),
|
||||
position: "top",
|
||||
run: "text the_flow.component2",
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.component2')",
|
||||
auto: true,
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_field_widget[name=product_id] input",
|
||||
content: _t("Write the name of your product."),
|
||||
position: "top",
|
||||
},
|
||||
...tour.stepUtils.mobileKanbanSearchMany2X('Product', 'the_flow.component2'),
|
||||
{
|
||||
trigger: ".o_field_widget[name=product_min_qty]",
|
||||
content: _t("Set the minimum product quantity"),
|
||||
position: "right",
|
||||
@@ -468,7 +702,9 @@ tour.register('main_flow_tour', {
|
||||
trigger: ".o_form_button_save",
|
||||
content: _t("<p>Save this reordering rule</p>"),
|
||||
position: "bottom"
|
||||
}, {
|
||||
},
|
||||
tour.stepUtils.openBuggerMenu("li.breadcrumb-item.active:contains('OP/')"),
|
||||
{
|
||||
// Run the schedulers
|
||||
trigger: ".o_menu_sections a:contains('Operations')",
|
||||
content: _t("Go to Run Schedulers"),
|
||||
@@ -488,33 +724,23 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_menu_toggle',
|
||||
content: _t('Go back to the home menu'),
|
||||
position: 'bottom',
|
||||
}, tour.stepUtils.showAppsMenuItem(), {
|
||||
trigger: '.o_app[data-menu-xmlid="purchase.menu_purchase_root"]',
|
||||
content: _t('Go to Purchase'),
|
||||
position: 'right',
|
||||
edition: 'community'
|
||||
}, {
|
||||
trigger: '.o_app[data-menu-xmlid="purchase.menu_purchase_root"]',
|
||||
content: _t('Go to Purchase'),
|
||||
position: 'bottom',
|
||||
edition: 'enterprise'
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goToAppSteps('purchase.menu_purchase_root', _t('Go to Purchase')),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: '.o_data_row:has(.o_data_cell:contains("the_flow.vendor"))',
|
||||
content: _t('Select the generated request for quotation'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Confirm Order')",
|
||||
content: _t("Confirm quotation"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Receive Products')",
|
||||
content: _t("Receive Product"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Validate')",
|
||||
content: _t("Validate"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_kanban_record:has(.o_kanban_record_title:contains("the_flow.vendor"))',
|
||||
content: _t('Select the generated request for quotation'),
|
||||
position: 'bottom',
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Confirm Order', _t("Confirm quotation")),
|
||||
...tour.stepUtils.statusbarButtonsSteps('Receive Products', _t("Receive Product"), ".o_statusbar_status .btn.dropdown-toggle:contains('Purchase Order')"),
|
||||
...tour.stepUtils.statusbarButtonsSteps('Validate', _t("Validate"), ".o_statusbar_status .btn.dropdown-toggle:contains('Ready')"),
|
||||
{
|
||||
trigger: ".modal-footer .btn-primary",
|
||||
extra_trigger: ".modal-dialog",
|
||||
content: _t("Apply"),
|
||||
@@ -523,19 +749,11 @@ tour.register('main_flow_tour', {
|
||||
trigger: ".o_back_button a, .breadcrumb-item:not('.active'):last",
|
||||
content: _t('go back to the purchase order'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Create Bill')",
|
||||
content: _t('go to Vendor Bills'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Post')",
|
||||
content: _t("Try to send it to email"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Register Payment')",
|
||||
content: _t("Register Payment"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Create Bill', _t('go to Vendor Bills'), ".o_statusbar_status .btn.dropdown-toggle:contains('Purchase Order')"),
|
||||
...tour.stepUtils.statusbarButtonsSteps('Post', _t("Try to send it to email"), ".o_statusbar_status .btn.dropdown-toggle:contains('Draft')"),
|
||||
...tour.stepUtils.statusbarButtonsSteps('Register Payment', _t("Register Payment"), ".o_statusbar_status .btn.dropdown-toggle:contains('Posted')"),
|
||||
{
|
||||
trigger: ".modal-footer .btn-primary",
|
||||
content: _t("Validate"),
|
||||
position: "bottom",
|
||||
@@ -544,60 +762,65 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_menu_toggle',
|
||||
content: _t('Go back to the home menu'),
|
||||
position: 'bottom',
|
||||
}, tour.stepUtils.showAppsMenuItem(), {
|
||||
trigger: '.o_app[data-menu-xmlid="mrp.menu_mrp_root"]',
|
||||
content: _t('Go to Manufacturing'),
|
||||
position: 'right',
|
||||
edition: 'community'
|
||||
}, {
|
||||
trigger: '.o_app[data-menu-xmlid="mrp.menu_mrp_root"]',
|
||||
content: _t('Go to Manufacturing'),
|
||||
position: 'bottom',
|
||||
edition: 'enterprise'
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goToAppSteps('mrp.menu_mrp_root', _t('Go to Manufacturing')),
|
||||
tour.stepUtils.openBuggerMenu("li.breadcrumb-item.active:contains('Manufacturing Orders'), li.breadcrumb-item.active:contains('Work Centers Overview')"),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: ".o_menu_sections a[data-menu-xmlid='mrp.menu_mrp_manufacturing']",
|
||||
content: _t('Click on Operations menuitem'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_menu_sections a[data-menu-xmlid='mrp.menu_mrp_production_action']",
|
||||
content: _t('Open manufacturing orders'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: '.o_data_row:has(.o_data_cell:contains("the_flow.product")):first',
|
||||
content: _t('Select the generated manufacturing order'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button[name='action_assign']:enabled",
|
||||
content: _t("Check availability"),
|
||||
mobile: true,
|
||||
trigger: ".o_menu_sections a:contains('Operations')",
|
||||
extra_trigger: '.o_main_navbar',
|
||||
content: _t("Let's go to manufacturing order."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Produce')",
|
||||
content: _t("Produce"),
|
||||
position: "bottom",
|
||||
mobile: true,
|
||||
trigger: ".o_menu_sections a:has(span:contains('Manufacturing Orders'))",
|
||||
content: _t("Let's go to manufacturing order."),
|
||||
position: "bottom"
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.o_kanban_record:has(.o_kanban_record_title:contains("the_flow.product")):first',
|
||||
extra_trigger: "li.breadcrumb-item.active:contains('Manufacturing Orders')",
|
||||
content: _t('Select the generated manufacturing order'),
|
||||
position: 'bottom',
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Check availability', _t("Check availability")),
|
||||
...tour.stepUtils.statusbarButtonsSteps('Produce', _t("Produce"), "body.o_web_client:not(.oe_wait)"),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: ".modal-footer .btn-primary:nth-child(3)",
|
||||
content: _t('Record Production'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Mark as Done')",
|
||||
content: _t("Mark as Done"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.modal-footer .btn-primary[name="do_produce"]:not(.o_invisible_modifier)',
|
||||
content: _t('Record Production'),
|
||||
position: 'bottom',
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Mark as Done', _t("Mark as Done"), ".o_statusbar_status .btn.dropdown-toggle:contains('To Close')"),
|
||||
{
|
||||
edition: "enterprise",
|
||||
trigger: '.o_menu_toggle',
|
||||
content: _t('Go back to the home menu'),
|
||||
position: 'bottom',
|
||||
}, tour.stepUtils.showAppsMenuItem(), {
|
||||
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]',
|
||||
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
|
||||
position: 'bottom',
|
||||
edition: 'community'
|
||||
}, {
|
||||
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]',
|
||||
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
|
||||
position: 'bottom',
|
||||
edition: 'enterprise'
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goToAppSteps('sale.sale_menu_root', _t('Organize your sales activities with the <b>Sales app</b>.')),
|
||||
tour.stepUtils.openBuggerMenu("li.breadcrumb-item.active:contains('Quotations')"),
|
||||
{
|
||||
trigger: ".o_menu_sections a[data-menu-xmlid='sale.sale_order_menu']",
|
||||
content: _t("Go to Sales menu"),
|
||||
position: "bottom"
|
||||
@@ -606,19 +829,37 @@ tour.register('main_flow_tour', {
|
||||
content: _t("Go to the sales orders"),
|
||||
position: "bottom"
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".o_data_row:first",
|
||||
extra_trigger: '.o_control_panel .breadcrumb:contains("Sales Orders")',
|
||||
content: _t("Go to the last sale order"),
|
||||
position: "right"
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_kanban_record:first",
|
||||
extra_trigger: '.o_control_panel .breadcrumb:contains("Sales Orders")',
|
||||
content: _t("Go to the last sale order"),
|
||||
position: "bottom"
|
||||
},
|
||||
tour.stepUtils.mobileModifier(tour.stepUtils.autoExpandMoreButtons('.o_control_panel .breadcrumb:contains("S0")')),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: '.oe_button_box .oe_stat_button:has(div[name=tasks_count])',
|
||||
content: _t('See Tasks'),
|
||||
position: 'right',
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: '.oe_button_box .oe_stat_button:has(div[name=tasks_count])',
|
||||
extra_trigger: '.o_control_panel .breadcrumb:contains("S0")',
|
||||
content: _t('See Tasks'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: '.o_field_widget[name=project_id]',
|
||||
content: _t('See Project'),
|
||||
position: 'right',
|
||||
}, {
|
||||
},
|
||||
tour.stepUtils.mobileModifier(tour.stepUtils.autoExpandMoreButtons('.o_control_panel .breadcrumb:contains("the_flow.project")')),
|
||||
{
|
||||
trigger: '.oe_button_box .oe_stat_button:has(span:contains("Timesheets"))',
|
||||
extra_trigger: '.o_form_readonly',
|
||||
content: _t('See Timesheets'),
|
||||
@@ -628,6 +869,7 @@ tour.register('main_flow_tour', {
|
||||
content: _t('Add a Timesheet'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
// FIXME replace list by kanban + form
|
||||
trigger: '.o_selected_row input[name=name]',
|
||||
content: _t('Set description'),
|
||||
position: 'bottom',
|
||||
@@ -638,8 +880,15 @@ tour.register('main_flow_tour', {
|
||||
position: 'bottom',
|
||||
run: 'click',
|
||||
}, {
|
||||
mobile: false,
|
||||
trigger: ".ui-menu-item > a",
|
||||
auto: true,
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_kanban_record .o_kanban_record_title :contains('the_flow.service')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Task')",
|
||||
content: _t("Select the the_flow.vendor"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: '.o_selected_row input[name=unit_amount]',
|
||||
content: _t('Set time'),
|
||||
@@ -649,28 +898,29 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_list_button_save',
|
||||
content: _t('Save'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.goBackBreadcrumbsMobile(
|
||||
_t('Back to the sale order'),
|
||||
undefined,
|
||||
".breadcrumb-item.active:contains('the_flow.project')",
|
||||
".breadcrumb-item.active:contains('the_flow.service')"
|
||||
),
|
||||
{
|
||||
mobile: false,
|
||||
trigger: '.breadcrumb-item:nth-child(2) a',
|
||||
extra_trigger: '.o_list_button_add', // Waiting save
|
||||
content: _t('Back to the sale order'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Create Invoice')",
|
||||
content: _t("Validate"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Create Invoice', _t("Validate"), ".o_field_widget[name=order_line]"),
|
||||
{
|
||||
trigger: ".modal-footer .btn-primary",
|
||||
content: _t("Create and View Invoices"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Post')",
|
||||
content: _t("Validate"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Register Payment')",
|
||||
content: _t("Register Payment"),
|
||||
position: "bottom",
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Post', _t("Validate"), ".breadcrumb-item.active:contains('Draft Invoice')"),
|
||||
...tour.stepUtils.statusbarButtonsSteps('Register Payment', _t("Register Payment"), ".breadcrumb-item.active:contains('INV/')"),
|
||||
{
|
||||
trigger: ".modal-footer .btn-primary",
|
||||
content: _t("Validate"),
|
||||
position: "bottom",
|
||||
@@ -722,6 +972,7 @@ tour.register('main_flow_tour', {
|
||||
position: 'right',
|
||||
run: 'text 9010.85', // + 12.65
|
||||
}, {
|
||||
// FIXME convert list in kanban + form
|
||||
edition: "enterprise",
|
||||
trigger: ".o_field_widget[name=line_ids] .o_field_x2many_list_row_add > a",
|
||||
content: _t("Click here to add some lines."),
|
||||
@@ -733,16 +984,30 @@ tour.register('main_flow_tour', {
|
||||
position: "bottom",
|
||||
run: "text 11.00",
|
||||
}, {
|
||||
mobile: false,
|
||||
edition: "enterprise",
|
||||
trigger: ".o_selected_row .o_field_widget[name=partner_id] input",
|
||||
content: _t("Write the name of your customer."),
|
||||
position: "bottom",
|
||||
run: "text the_flow.customer",
|
||||
}, {
|
||||
mobile: false,
|
||||
edition: "enterprise",
|
||||
trigger: ".ui-menu-item > a:contains('the_flow.customer')",
|
||||
in_modal: false,
|
||||
auto: true,
|
||||
}, {
|
||||
mobile: true,
|
||||
edition: "enterprise",
|
||||
trigger: ".o_selected_row .o_field_widget[name=partner_id] input",
|
||||
content: _t("Write the name of your customer."),
|
||||
position: "bottom",
|
||||
}, {
|
||||
mobile: true,
|
||||
trigger: ".o_kanban_record .o_kanban_record_title :contains('the_flow.customer')",
|
||||
extra_trigger: ".modal:not(.o_inactive_modal) .modal-title:contains('Partner')",
|
||||
content: _t('Save'),
|
||||
position: 'right',
|
||||
}, {
|
||||
edition: "enterprise",
|
||||
trigger: ".o_selected_row .o_field_widget[name=name]",
|
||||
@@ -754,12 +1019,9 @@ tour.register('main_flow_tour', {
|
||||
trigger: '.o_form_button_save',
|
||||
content: _t('Save.'),
|
||||
position: 'bottom',
|
||||
}, {
|
||||
edition: "enterprise",
|
||||
trigger: ".o_statusbar_buttons > button:enabled:contains('Reconcile')",
|
||||
content: _t('<p><b>Reconcile</p>'),
|
||||
position: "bottom",
|
||||
}, {
|
||||
},
|
||||
...tour.stepUtils.statusbarButtonsSteps('Reconcile', _t('<p><b>Reconcile</p>'), ".breadcrumb-item.active:contains('the_flow.statement')").map(tour.stepUtils.editionEnterpriseModifier),
|
||||
{
|
||||
edition: "enterprise",
|
||||
trigger: "button.o_reconcile, button.o_validate",
|
||||
content: _t('<p><b>Click on Reconcile</p>'),
|
||||
|
||||
Reference in New Issue
Block a user