diff --git a/odoo/addons/test_main_flows/static/tests/tours/main_flow.js b/odoo/addons/test_main_flows/static/tests/tours/main_flow.js index 0152cb7c05b..4f079715b2e 100644 --- a/odoo/addons/test_main_flows/static/tests/tours/main_flow.js +++ b/odoo/addons/test_main_flows/static/tests/tours/main_flow.js @@ -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 Sales app.'), - position: 'right', - edition: 'community' -}, { - trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]', - content: _t('Organize your sales activities with the Sales app.'), - position: 'bottom', - edition: 'enterprise' -}, { +}, [ +...tour.stepUtils.goToAppSteps('sale.sale_menu_root', _t('Organize your sales activities with the Sales app.')), +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 go back to products."), position: "bottom" -}, { +}, +...tour.stepUtils.goBackBreadcrumbsMobile( + _t("Use the breadcrumbs to go back to products."), + 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 CRM app.'), - position: 'right', - edition: 'community' -}, { - trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"]', - content: _t('Organize your sales activities with the CRM app.'), - position: 'bottom', - edition: 'enterprise' -}, { +}, +...tour.stepUtils.goToAppSteps('crm.crm_menu_root', _t('Organize your sales activities with the CRM app.')), +{ trigger: ".o-kanban-button-new", extra_trigger: '.o_opportunity_kanban', content: _t("Click here to create your first opportunity 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 add your opportunity."), position: "right", }, { + mobile: false, trigger: ".o_kanban_group:first .o_kanban_record:has(span:contains('the_flow.opportunity'))", content: _t("Drag & drop opportunities 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('
Create a quotation
'), - 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('Create a quotation
')), +{ + 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("Confirm this quotation
"), - position: "bottom" -}, { +}, +...tour.stepUtils.statusbarButtonsSteps('Confirm', _t("Confirm this quotation
")), +{ trigger: ".o_form_button_save", extra_trigger: ".o_statusbar_status .btn-primary:contains('Sales Order')", content: _t("Save this quotation
"), @@ -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("Save this reordering rule
"), 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 Sales app.'), - position: 'bottom', - edition: 'community' -}, { - trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]', - content: _t('Organize your sales activities with the Sales app.'), - position: 'bottom', - edition: 'enterprise' -}, { +}, +...tour.stepUtils.goToAppSteps('sale.sale_menu_root', _t('Organize your sales activities with the Sales app.')), +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('Reconcile
'), - position: "bottom", -}, { +}, +...tour.stepUtils.statusbarButtonsSteps('Reconcile', _t('Reconcile
'), ".breadcrumb-item.active:contains('the_flow.statement')").map(tour.stepUtils.editionEnterpriseModifier), +{ edition: "enterprise", trigger: "button.o_reconcile, button.o_validate", content: _t('Click on Reconcile
'),