Files
jikimo_sf/web_studio/static/tests/legacy/tours/web_studio.js
2023-04-14 17:42:23 +08:00

991 lines
37 KiB
JavaScript

odoo.define('web_studio.tests.tour', function (require) {
"use strict";
const localStorage = require('web.local_storage');
const tour = require('web_tour.tour');
const { randomString } = require('web_studio.utils');
let createdAppString = null;
let createdMenuString = null;
tour.register('web_studio_tests_tour', {
url: "/web",
test: true,
}, [{
// open studio
trigger: '.o_main_navbar .o_web_studio_navbar_item',
}, {
trigger: '.o_web_studio_new_app',
}, {
// the next steps are here to create a new app
trigger: '.o_web_studio_app_creator_next',
}, {
trigger: '.o_web_studio_app_creator_name > input',
run: 'text ' + (createdAppString = randomString(6)),
}, {
trigger: '.o_web_studio_app_creator_next.is_ready',
}, {
trigger: '.o_web_studio_app_creator_menu > input',
run: 'text ' + (createdMenuString = randomString(6)),
}, {
trigger: '.o_web_studio_app_creator_next.is_ready',
}, {
// disable chatter in model configurator, we'll test adding it on later
trigger: 'input[name="use_mail"]',
}, {
// disable company if visible, otherwise it might make the test uncertain
trigger: 'body',
run: () => {
const $input = $('input[name="use_company"]');
if ($input) {
$input.click();
}
}
}, {
trigger: '.o_web_studio_model_configurator_next',
}, {
// toggle the home menu outside of studio and come back in studio
extra_trigger: '.o_menu_toggle:not(.o_menu_toggle_back)',
trigger: '.o_web_studio_leave > a.btn',
timeout: 60000, /* previous step reloads registry, etc. - could take a long time */
}, {
extra_trigger: `.o_web_client:not(.o_in_studio)`, /* wait to be out of studio */
trigger: '.o_menu_toggle:not(.o_menu_toggle_back)',
timeout: 60000, /* previous step reloads registry, etc. - could take a long time */
}, {
trigger: '.o_main_navbar .o_web_studio_navbar_item',
extra_trigger: '.o_home_menu',
}, {
// open the app creator and leave it
trigger: '.o_web_studio_new_app',
}, {
extra_trigger: '.o_web_studio_app_creator',
trigger: '.o_web_studio_leave > a.btn',
}, {
// go back to the previous app
trigger: '.o_home_menu',
run: () => {
window.dispatchEvent(new KeyboardEvent('keydown', {
bubbles: true,
key: 'Escape',
}));
},
}, {
// this should open the previous app outside of studio
extra_trigger: `.o_web_client:not(.o_in_studio) .o_menu_brand:contains(${createdAppString})`,
// go back to the home menu
trigger: '.o_menu_toggle:not(.o_menu_toggle_back)',
}, {
trigger: 'input.o_search_hidden',
// Open Command Palette
run: 'text ' + createdMenuString[0],
}, {
trigger: '.o_command_palette_search input',
run: 'text ' + "/" + createdMenuString,
}, {
// search results should have been updated
extra_trigger: `.o_command.focused:contains(${createdAppString} / ${createdMenuString})`,
trigger: '.o_command_palette',
// Close the Command Palette
run: () => {
window.dispatchEvent(new KeyboardEvent('keydown', {
key: 'Escape',
}));
},
}, {
// enter Studio
trigger: '.o_main_navbar .o_web_studio_navbar_item',
}, {
// edit an app
extra_trigger: '.o_studio_home_menu',
trigger: `.o_app[data-menu-xmlid*="studio"]:contains(${createdAppString})`,
run: function () {
// We can't emulate a hover to display the edit icon
const editIcon = this.$anchor[0].querySelector('.o_web_studio_edit_icon');
editIcon.style.visibility = 'visible';
editIcon.click();
},
}, {
// design the icon
// TODO: we initially tested this (change an app icon) at the end but a
// long-standing bug (KeyError: ir.ui.menu.display_name, caused by a registry
// issue with multiple workers) on runbot prevent us from doing it. It thus have
// been moved at the beginning of this test to avoid the registry to be reloaded
// before the write on ir.ui.menu.
trigger: '.o_web_studio_selector:eq(0)',
}, {
trigger: '.o_web_studio_palette > .o_web_studio_selector:first',
}, {
trigger: '.modal-footer .btn.btn-primary',
}, {
// click on the created app
trigger: `.o_app[data-menu-xmlid*="studio"]:contains(${createdAppString})`,
}, {
// create a new menu
trigger: '.o_main_navbar .o_web_edit_menu',
}, {
trigger: 'footer.modal-footer .js_add_menu',
}, {
trigger: 'input[name="name"]',
run: 'text ' + (createdMenuString = randomString(6)),
}, {
trigger: 'div[name="model_choice"] input[data-value="existing"]',
}, {
trigger: '.o_field_many2one[name="model"] input',
run: 'text a',
}, {
trigger: '.ui-autocomplete > .ui-menu-item:first > a',
in_modal: false,
}, {
trigger: 'button:contains(Confirm):not(".disabled")',
}, {
trigger: 'button:contains(Confirm):not(".disabled")',
}, {
// check that the Studio menu is still there
extra_trigger: '.o_web_studio_menu',
// switch to form view
trigger: '.o_web_studio_views_icons > a[title="Form"]',
}, {
// wait for the form editor to be rendered because the sidebar is the same
extra_trigger: '.o_web_studio_form_view_editor',
// unfold 'Existing Fieldqs' section
trigger: '.o_web_studio_existing_fields_header',
}, {
// add an new field
trigger: '.o_web_studio_sidebar .o_web_studio_field_type_container:eq(1) .o_web_studio_field_char',
run: 'drag_and_drop .o_web_studio_form_view_editor .o_inner_group',
}, {
// click on the field
trigger: '.o_web_studio_form_view_editor .o_wrap_label:first label',
// when it's there
extra_trigger: 'input[data-type="field_name"]',
}, {
// rename the label
trigger: '.o_web_studio_sidebar_content.o_display_field input[name="string"]',
run: 'text My Coucou Field',
}, {
// verify that the field name has changed and change it
trigger: 'input[data-type="field_name"][value="my_coucou_field"]',
run: 'text coucou',
// the rename operation (/web_studio/rename_field + /web_studio/edit_view)
// takes a while and sometimes reaches the default 10s timeout
timeout: 20000,
}, {
// click on "Add" tab
trigger: '.o_web_studio_sidebar .o_web_studio_new',
// the rename operation (/web_studio/rename_field + /web_studio/edit_view)
// takes a while and sometimes reaches the default 10s timeout
timeout: 20000,
async run() {
// During the rename, the UI is blocked. When the rpc returns, the UI is
// unblocked and the sidebar is re-rendered. Without this, the step is
// sometimes executed exactly when the sidebar is about to be replaced,
// and it doesn't work. We thus here wait for 1s to ensure that the
// sidebar has been re-rendered, before going further.
// note1: there's nothing in the DOM that could be used to determine that
// we're ready to continue (the sidebar is just replaced by itself, same state)
// note2: ideally, it should work whenever we click, but with the current
// architecture of studio, it's really hard to fix. Hopefully, when studio
// will be converted to owl, this should no longer be an issue.
await new Promise((r) => setTimeout(r, 1000));
$(".o_web_studio_sidebar .o_web_studio_new").click();
}
}, {
// add a new field
trigger: '.o_web_studio_sidebar .o_web_studio_field_type_container:eq(1) .o_web_studio_field_char',
run: 'drag_and_drop .o_web_studio_form_view_editor .o_inner_group',
}, {
// rename the field with the same name
trigger: 'input[data-type="field_name"]',
run: 'text coucou',
}, {
// an alert dialog should be opened
trigger: '.modal-footer > button:first',
}, {
// rename the label
trigger: '.o_web_studio_sidebar_content.o_display_field input[name="string"]',
run: 'text COUCOU',
}, {
// verify that the field name has changed (post-fixed by _1)
extra_trigger: 'input[data-type="field_name"][value="coucou_1"]',
trigger: '.o_web_studio_sidebar .o_web_studio_new',
// the rename operation (/web_studio/rename_field + /web_studio/edit_view)
// takes a while and sometimes reaches the default 10s timeout
timeout: 20000,
}, {
// add a monetary field --> create a currency field
trigger: '.o_web_studio_sidebar .o_web_studio_field_type_container:eq(1) .o_web_studio_field_monetary',
run: 'drag_and_drop .o_web_studio_form_view_editor .o_inner_group',
}, {
trigger: '.modal-footer .btn.btn-primary',
}, {
// verify that the currency field is in the view
extra_trigger: '.o_web_studio_form_view_editor .o_wrap_label label:contains("Currency")',
trigger: '.o_web_studio_sidebar .o_web_studio_new',
async run() {
// When adding a new field, the UI is blocked. When the rpc returns, the UI is
// unblocked and the sidebar is re-rendered. Without this, the step is
// sometimes executed exactly when the sidebar is about to be replaced,
// and it doesn't work. We thus here wait for 1s to ensure that the
// sidebar has been re-rendered, before going further.
// note1: there's nothing in the DOM that could be used to determine that
// we're ready to continue (the sidebar is just replaced by itself, same state)
// note2: ideally, it should work whenever we click, but with the current
// architecture of studio, it's really hard to fix. Hopefully, when studio
// will be converted to owl, this should no longer be an issue.
await new Promise((r) => setTimeout(r, 1000));
$(".o_web_studio_sidebar .o_web_studio_new").click();
}
}, {
// add a monetary field
trigger: '.o_web_studio_sidebar .o_web_studio_field_type_container:eq(1) .o_web_studio_field_monetary',
run: 'drag_and_drop (.o_web_studio_form_view_editor .o_inner_group:first .o_web_studio_hook:eq(1))',
}, {
// verify that the monetary field is in the view
extra_trigger: '.o_web_studio_form_view_editor .o_wrap_label:eq(1) label:contains("New Monetary")',
// switch the two first fields
trigger: '.o_web_studio_form_view_editor .o_inner_group:first .o-draggable:eq(1)',
run: 'drag_and_drop_native .o_inner_group:first .o_web_studio_hook:first',
}, {
// click on "Add" tab
trigger: '.o_web_studio_sidebar .o_web_studio_new',
}, {
// verify that the fields have been switched
extra_trigger: '.o_web_studio_form_view_editor .o_wrap_label:eq(0) label:contains("New Monetary")',
// add a m2m field
trigger: '.o_web_studio_sidebar .o_web_studio_field_type_container:eq(1) .o_web_studio_field_many2many',
run: 'drag_and_drop .o_inner_group:first .o_web_studio_hook:first',
}, {
// type something in the modal
trigger: '.o_field_many2one[name="model"] input',
run: 'text a',
}, {
// select the first model
trigger: '.ui-autocomplete > .ui-menu-item:first > a',
in_modal: false,
}, {
trigger: 'button:contains(Confirm)',
}, {
// select the m2m to set its properties
trigger: '.o_wrap_input:has(.o_field_many2many)',
timeout: 15000, // creating M2M relations can take some time...
}, {
// change the `widget` attribute
trigger: '.o_web_studio_sidebar select[name="widget"]',
run: function () {
this.$anchor.val('many2many_tags').trigger('change');
},
}, {
// use colors on the m2m tags
trigger: '.o_web_studio_sidebar label[for="option_color_field"]',
}, {
// add a statusbar
trigger: '.o_web_studio_statusbar_hook',
}, {
trigger: '.modal-footer .btn.btn-primary',
}, {
trigger: '.o_statusbar_status',
}, {
// verify that a default value has been set for the statusbar
trigger: '.o_web_studio_sidebar select[name="default_value"]:contains(First Status)',
}, {
trigger: '.o_web_studio_views_icons a[title=Form]',
}, {
// verify Chatter can be added after changing view to form
extra_trigger: '.o_web_studio_add_chatter',
// edit action
trigger: '.o_web_studio_menu .o_menu_sections li a:contains(Views)',
}, {
// edit form view
trigger: '.o_web_studio_view_category .o_web_studio_view_type[data-type="form"] .o_web_studio_thumbnail',
}, {
// verify Chatter can be added after changing view to form
extra_trigger: '.o_web_studio_add_chatter',
// switch in list view
trigger: '.o_web_studio_menu .o_web_studio_views_icons a[title="List"]',
}, {
// wait for the list editor to be rendered because the sidebar is the same
extra_trigger: '.o_web_studio_list_view_editor',
// unfold 'Existing Fieldqs' section
trigger: '.o_web_studio_existing_fields_header',
}, {
// add an existing field (display_name)
trigger: '.o_web_studio_sidebar .o_web_studio_field_type_container:eq(1) .o_web_studio_field_char',
run: 'drag_and_drop .o_web_studio_list_view_editor th.o_web_studio_hook:first',
}, {
// verify that the field is correctly named
extra_trigger: '.o_web_studio_list_view_editor th:contains("COUCOU")',
// leave Studio
trigger: '.o_web_studio_leave > a.btn',
}, {
// come back to the home menu to check if the menu data have changed
extra_trigger: '.o_web_client:not(.o_in_studio)',
trigger: '.o_menu_toggle:not(.o_menu_toggle_back)',
}, {
trigger: 'input.o_search_hidden',
// Open Command Palette
run: 'text ' + createdMenuString[0],
}, {
trigger: '.o_command_palette_search input',
run: 'text ' + "/" + createdMenuString,
}, {
// search results should have been updated
extra_trigger: `.o_command.focused:contains(${createdAppString} / ${createdMenuString})`,
trigger: '.o_command_palette',
// Close the Command Palette
run: () => {
window.dispatchEvent(new KeyboardEvent('keydown', {
bubbles: true,
key: 'Escape',
}));
},
}, {
trigger: '.o_home_menu',
// go back again to the app (using keyboard)
run: () => {
window.dispatchEvent(new KeyboardEvent('keydown', {
bubbles: true,
key: 'Escape',
}));
},
}, {
// wait to be back in the list view
extra_trigger: '.o_list_view',
// re-open studio
trigger: '.o_web_studio_navbar_item',
}, {
// modify the list view
trigger: '.o_web_studio_sidebar .o_web_studio_view'
}, {
//select field you want to sort and based on that sorting will be applied on List view
trigger: '.o_web_studio_sidebar .o_web_studio_sidebar_select #sort_field',
run: function () {
$('#sort_field option:eq(1)').attr('selected', 'selected');
$('#sort_field option:eq(1)').change();
}
}, {
//change order of sorting, Select order and change it
trigger: '.o_web_studio_sidebar .o_web_studio_sidebar_select #sort_order',
run: function () {
$('#sort_order option:eq(1)').attr('selected', 'selected');
$('#sort_order option:eq(1)').change();
}
}, {
// edit action
trigger: '.o_web_studio_menu .o_menu_sections li a:contains("Views")',
}, {
// add a kanban
trigger: '.o_web_studio_view_category .o_web_studio_view_type.o_web_studio_inactive[data-type="kanban"] .o_web_studio_thumbnail',
}, {
// add a dropdown
trigger: '.o_dropdown_kanban.o_web_studio_add_dropdown',
}, {
trigger: '.modal-footer .btn.btn-primary',
}, {
// select the dropdown for edition
trigger: '.o_dropdown_kanban:not(.o_web_studio_add_dropdown)',
}, {
// enable "Set Cover" feature
trigger: '.o_web_studio_sidebar input[name=set_cover]',
}, {
trigger: '.modal-footer .btn.btn-primary',
}, {
// edit action
trigger: '.o_web_studio_menu .o_menu_sections li a:contains("Views")',
}, {
// check that the kanban view is now active
extra_trigger: '.o_web_studio_view_category .o_web_studio_view_type:not(.o_web_studio_inactive)[data-type="kanban"]',
// add an activity view
trigger: '.o_web_studio_view_category .o_web_studio_view_type.o_web_studio_inactive[data-type="activity"] .o_web_studio_thumbnail',
}, {
extra_trigger: '.o_activity_view',
// edit action
trigger: '.o_web_studio_menu .o_menu_sections li a:contains("Views")',
timeout: 20000, // activating a view takes a while and sometimes reaches the default 10s timeout
}, {
// add a graph view
trigger: '.o_web_studio_view_category .o_web_studio_view_type.o_web_studio_inactive[data-type="graph"] .o_web_studio_thumbnail',
}, {
extra_trigger: '.o_graph_renderer',
trigger: '.o_web_studio_menu .o_menu_sections li a:contains("Views")',
}, {
extra_trigger: '.o_web_studio_views',
// edit the search view
trigger: '.o_web_studio_view_category .o_web_studio_view_type[data-type="search"] .o_web_studio_thumbnail',
}, {
extra_trigger: '.o_web_studio_search_view_editor',
trigger: '.o_menu_toggle:not(.o_menu_toggle_back)',
}, {
trigger: '.o_web_studio_home_studio_menu .dropdown-toggle',
}, {
// export all modifications
trigger: '.o_web_studio_export',
}, {
// click on the created app
trigger: '.o_app[data-menu-xmlid*="studio"]:last',
}, {
// switch to form view
trigger: '.o_web_studio_views_icons > a[title="Form"]',
}, {
extra_trigger: '.o_web_studio_form_view_editor',
// click on the view tab
trigger: '.o_web_studio_view',
}, {
// click on the restore default view button
trigger: '.o_web_studio_restore',
}, {
// click on the ok button
trigger: '.modal-footer .btn.btn-primary',
}, {
// checks that the field doesn't exist anymore
extra_trigger: 'label.o_form_label:not(:contains("COUCOU"))',
trigger: '.o_web_studio_leave > a.btn'
}]);
tour.register('web_studio_hide_fields_tour', {
url: "/web#action=studio&mode=home_menu",
test: true,
}, [{
trigger: '.o_web_studio_new_app',
}, {
trigger: '.o_web_studio_app_creator_next',
}, {
trigger: `
.o_web_studio_app_creator_name
> input`,
run: `text ${randomString(6)}`,
}, {
// make another interaction to show "next" button
trigger: `
.o_web_studio_selectors
.o_web_studio_selector:eq(2)`,
}, {
trigger: '.o_web_studio_app_creator_next',
}, {
trigger: `
.o_web_studio_app_creator_menu
> input`,
run: `text ${randomString(6)}`,
}, {
trigger: '.o_web_studio_app_creator_next',
}, {
trigger: '.o_web_studio_model_configurator_next',
}, {
// check that the Studio menu is still there
extra_trigger: '.o_web_studio_menu',
trigger: '.o_web_studio_leave > a.btn',
timeout: 60000, /* previous step reloads registry, etc. - could take a long time */
}, {
trigger: '.oe_title input',
run: 'text Test',
}, {
trigger: '.o_form_button_save',
}, {
trigger: '.o_web_studio_navbar_item',
}, {
extra_trigger: '.o_web_studio_menu',
trigger: `
.o_web_studio_views_icons
> a[title="List"]`,
}, {
// wait for the list editor to be rendered because the sidebar is the same
extra_trigger: '.o_web_studio_list_view_editor',
trigger: '.o_web_studio_existing_fields_icon',
}, {
trigger: `
.o_web_studio_sidebar
.o_web_studio_existing_fields
.o_web_studio_component:has(.o_web_studio_component_description:contains(display_name))`,
run: 'drag_and_drop .o_web_studio_list_view_editor .o_web_studio_hook',
}, {
trigger: `
.o_list_table
th[data-name="display_name"]`,
}, {
trigger: `
.o_web_studio_sidebar
select[name="optional"]`,
run: "text Hide by default",
}, {
extra_trigger: '.o_list_table:not(:has(th[data-name="display_name"]))',
trigger: `
.o_web_studio_sidebar_header
.o_web_studio_view`,
}, {
trigger: `
.o_web_studio_sidebar_checkbox
input#show_invisible`,
}, {
extra_trigger: `
.o_list_table
th[data-name="display_name"].o_web_studio_show_invisible`,
trigger: '.o_web_studio_leave > a.btn',
}]);
tour.register('web_studio_model_option_value_tour', {
url: "/web?debug=tests#action=studio&mode=home_menu",
test: true,
}, [{
trigger: '.o_web_studio_new_app',
}, {
trigger: '.o_web_studio_app_creator_next',
}, {
trigger: `
.o_web_studio_app_creator_name
> input`,
run: `text ${randomString(6)}`,
}, {
trigger: `
.o_web_studio_selectors
.o_web_studio_selector:eq(2)`,
}, {
trigger: '.o_web_studio_app_creator_next',
}, {
trigger: `
.o_web_studio_app_creator_menu
> input`,
run: `text ${randomString(6)}`,
}, {
trigger: '.o_web_studio_app_creator_next',
}, {
// check monetary value in model configurator
trigger: 'input[name="use_value"]',
}, {
// check lines value in model configurator
trigger: 'input[name="lines"]',
}, {
trigger: '.o_web_studio_model_configurator_next',
}, {
trigger: '.o_web_studio_menu .o_web_studio_views_icons > a[title="Graph"]',
timeout: 60000, /* previous step reloads registry, etc. - could take a long time */
}, {
// wait for the graph editor to be rendered and also check for sample data
extra_trigger: '.o_view_sample_data .o_graph_renderer',
trigger: '.o_web_studio_menu .o_web_studio_views_icons a[title="Pivot"]',
}, {
// wait for the pivot editor to be rendered and also check for sample data
extra_trigger: '.o_pivot_view .o_view_sample_data .o_view_nocontent_empty_folder',
trigger: '.o_web_studio_leave > a.btn',
}]);
tour.register('web_studio_new_report_tour', {
url: "/web",
test: true,
}, [{
// open studio
trigger: '.o_main_navbar .o_web_studio_navbar_item',
}, {
// click on the created app
trigger: '.o_app[data-menu-xmlid*="studio"]:first',
extra_trigger: 'body.o_in_studio',
}, {
// edit reports
trigger: '.o_web_studio_menu li a:contains(Reports)',
}, {
// create a new report
trigger: '.o_control_panel .o-kanban-button-new',
}, {
// select external layout
trigger: '.o_web_studio_report_layout_dialog div[data-layout="web.external_layout"]',
}, {
// sidebar should display add tab
extra_trigger: '.o_web_studio_report_editor_manager .o_web_studio_sidebar_header div.active[name="new"]',
// switch to 'Report' tab
trigger: '.o_web_studio_report_editor_manager .o_web_studio_sidebar_header div[name="report"]',
}, {
// edit report name
trigger: '.o_web_studio_sidebar input[name="name"]',
run: 'text My Awesome Report',
}, {
// switch to 'Add' in Sidebar
trigger: '.o_web_studio_sidebar div[name="new"]',
}, {
// wait for the iframe to be loaded
extra_trigger: '.o_web_studio_report_editor iframe #wrapwrap',
// add a 'title' building block
trigger: '.o_web_studio_sidebar .o_web_studio_component:contains(Title Block)',
run: 'drag_and_drop .o_web_studio_report_editor iframe .article > .page',
auto: true,
}, {
// click on the newly added field
trigger: '.o_web_studio_report_editor iframe .h2 > span:contains(New Title)',
}, {
// change the text of the H2 to 'test'
trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable',
run: function () {
this.$anchor.focusIn();
this.$anchor[0].firstChild.textContent = 'Test';
this.$anchor.keydown();
this.$anchor.blur();
}
}, {
// click outside to blur the field
trigger: '.o_web_studio_report_editor',
extra_trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable:contains(Test)',
}, {
extra_trigger: '.o_web_studio_report_editor iframe .h2:contains(Test)',
// add a new group on the node
trigger: '.o_web_studio_sidebar .o_field_many2manytags[name="groups"] input',
run: function () {
this.$anchor.click();
},
}, {
trigger: '.ui-autocomplete:visible li:contains(Access Rights)',
}, {
// wait for the group to appear
extra_trigger: '.o_web_studio_sidebar .o_field_many2manytags[name="groups"] .o_badge_text:contains(Access Rights)',
// switch to 'Add' in Sidebar
trigger: '.o_web_studio_sidebar div[name="new"]',
}, {
// add a 'title' building block Data Table
trigger: '.o_web_studio_sidebar .o_web_studio_component:contains(Data table)',
run: 'drag_and_drop .o_web_studio_report_editor iframe .article > .page',
}, {
// expand the model selector in the popup
trigger: 'div.o_field_selector_value',
run: function () {
$('div.o_field_selector_value').focusin();
}
}, {
// select the second element of the model (followers)
trigger: '.o_field_selector_popover_body > ul > li:contains(Followers)'
}, {
trigger:'.modal-content button>span:contains(Confirm)', // button
extra_trigger:'.o_field_selector_chain_part:contains(Followers)',//content of the field is set
}, {
// select the content of the first field of the newly added table
trigger: '.o_web_studio_report_editor iframe span[t-field="table_line.display_name"]'
}, {
// change the bound field
trigger: '.o_web_studio_sidebar .card:last() div.o_field_selector_value',
run: function () {
$('.o_web_studio_sidebar .card:last() div.o_field_selector_value').focusin();
}
}, {
trigger: 'ul.o_field_selector_page li:contains(ID)'
}, {
// update the title of the column
extra_trigger: '.o_web_studio_report_editor iframe span[t-field="table_line.id"]',
trigger: '.o_web_studio_report_editor iframe table thead span:contains(Name) ', // the name title
//extra_trigger: '.o_web_studio_report_editor iframe span[t-field="table_line.display_name"]:not(:contains(YourCompany, Administrator))', // the id has been updated in the iframe
}, {
// update column title 'name' into another title
trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable',
run: function () {
this.$anchor.focusIn();
this.$anchor[0].firstChild.textContent = 'new column title';
this.$anchor.keydown();
this.$anchor.blur();
}
}, {
// click outside to blur the field
trigger: '.o_web_studio_report_editor',
extra_trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable:contains(new column title)',
}, {
// wait to be sure the modification has been correctly applied
extra_trigger: '.o_web_studio_report_editor iframe table thead span:contains(new column title) ',
// leave the report
trigger: '.o_web_studio_breadcrumb .o_back_button:contains(Reports)',
}, {
// a invisible element cannot be used as a trigger so this small hack is
// mandatory for the next step
run: function () {
$('.o_kanban_record:contains(My Awesome Report) .dropdown-toggle').css('visibility', 'visible');
},
trigger: '.o_legacy_kanban_view',
}, {
// open the dropdown
trigger: '.o_kanban_record:contains(My Awesome Report) .dropdown-toggle',
}, {
// duplicate the report
trigger: '.o_kanban_record:contains(My Awesome Report) .dropdown-menu a:contains(Duplicate)',
}, {
// open the duplicate report
trigger: '.o_kanban_record:contains(My Awesome Report copy(1))',
}, {
// switch to 'Report' tab
trigger: '.o_web_studio_report_editor_manager .o_web_studio_sidebar_header div[name="report"]',
}, {
// wait for the duplicated report to be correctly loaded
extra_trigger: '.o_web_studio_sidebar input[name="name"][value="My Awesome Report copy(1)"]',
// leave Studio
trigger: '.o_web_studio_leave > a.btn',
}]);
tour.register('web_studio_new_report_basic_layout_tour', {
url: "/web",
test: true,
}, [{
// open studio
trigger: '.o_main_navbar .o_web_studio_navbar_item',
}, {
// click on the created app
trigger: '.o_app[data-menu-xmlid*="studio"]:first',
extra_trigger: 'body.o_in_studio',
}, {
// edit reports
trigger: '.o_web_studio_menu li a:contains(Reports)',
}, {
// create a new report
trigger: '.o_control_panel .o-kanban-button-new',
}, {
// select external layout
trigger: '.o_web_studio_report_layout_dialog div[data-layout="web.basic_layout"]',
}, {
// sidebar should display add tab
extra_trigger: '.o_web_studio_report_editor_manager .o_web_studio_sidebar_header div.active[name="new"]',
// switch to 'Report' tab
trigger: '.o_web_studio_report_editor_manager .o_web_studio_sidebar_header div[name="report"]',
}, {
// edit report name
trigger: '.o_web_studio_sidebar input[name="name"]',
run: 'text My Awesome basic layout Report',
}, {
// switch to 'Add' in Sidebar
trigger: '.o_web_studio_sidebar div[name="new"]',
}, {
// wait for the iframe to be loaded
extra_trigger: '.o_web_studio_report_editor iframe #wrapwrap',
// add a 'title' building block
trigger: '.o_web_studio_sidebar .o_web_studio_component:contains(Title Block)',
run: 'drag_and_drop .o_web_studio_report_editor iframe .article > .page',
auto: true,
}, {
// click on the newly added field
trigger: '.o_web_studio_report_editor iframe .h2 > span:contains(New Title)',
}, {
// change the text of the H2 to 'test'
trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable',
run: function () {
this.$anchor.focusIn();
this.$anchor[0].firstChild.textContent = 'Test';
this.$anchor.keydown();
this.$anchor.blur();
}
}, {
// click outside to blur the field
trigger: '.o_web_studio_report_editor',
extra_trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable:contains(Test)',
}, {
extra_trigger: '.o_web_studio_report_editor iframe .h2:contains(Test)',
// add a new group on the node
trigger: '.o_web_studio_sidebar .o_field_many2manytags[name="groups"] input',
run: function () {
this.$anchor.click();
},
}, {
trigger: '.ui-autocomplete:visible li:contains(Access Rights)',
}, {
// wait for the group to appear
extra_trigger: '.o_web_studio_sidebar .o_field_many2manytags[name="groups"] .o_badge_text:contains(Access Rights)',
// switch to 'Add' in Sidebar
trigger: '.o_web_studio_sidebar div[name="new"]',
}, {
// add a 'title' building block Data Table
trigger: '.o_web_studio_sidebar .o_web_studio_component:contains(Data table)',
run: 'drag_and_drop .o_web_studio_report_editor iframe .article > .page',
}, {
// expand the model selector in the popup
trigger: 'div.o_field_selector_value',
run: function () {
$('div.o_field_selector_value').focusin();
}
}, {
// select the second element of the model (followers)
trigger: '.o_field_selector_popover_body > ul > li:contains(Followers)'
}, {
trigger:'.modal-content button>span:contains(Confirm)', // button
extra_trigger:'.o_field_selector_chain_part:contains(Followers)', //content of the field is set
}, {
// select the content of the first field of the newly added table
trigger: '.o_web_studio_report_editor iframe span[t-field="table_line.display_name"]'
}, {
// change the bound field
trigger: '.o_web_studio_sidebar .card:last() div.o_field_selector_value',
run: function () {
$('.o_web_studio_sidebar .card:last() div.o_field_selector_value').focusin();
}
}, {
trigger: 'ul.o_field_selector_page li:contains(ID)'
}, {
// update the title of the column
trigger: '.o_web_studio_report_editor iframe table thead span:contains(Name) ', // the name title
//extra_trigger: '.o_web_studio_report_editor iframe span[t-field="table_line.display_name"]:not(:contains(YourCompany, Administrator))', // the id has been updated in the iframe
}, {
// update column title 'name' into another title
trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable',
run: function () {
this.$anchor.focusIn();
this.$anchor[0].firstChild.textContent = 'new column title';
this.$anchor.keydown();
this.$anchor.blur();
}
}, {
// click outside to blur the field
trigger: '.o_web_studio_report_editor',
extra_trigger: '.o_web_studio_sidebar .o_web_studio_text .note-editable:contains(new column title)',
}, {
// wait to be sure the modification has been correctly applied
extra_trigger: '.o_web_studio_report_editor iframe table thead span:contains(new column title) ',
// leave the report
trigger: '.o_web_studio_breadcrumb .o_back_button:contains(Reports)',
}, {
// a invisible element cannot be used as a trigger so this small hack is
// mandatory for the next step
run: function () {
$('.o_kanban_record:contains(My Awesome basic layout Report) .dropdown-toggle').css('visibility', 'visible');
},
trigger: '.o_legacy_kanban_view',
}, {
// open the dropdown
trigger: '.o_kanban_record:contains(My Awesome basic layout Report) .dropdown-toggle',
}, {
// duplicate the report
trigger: '.o_kanban_record:contains(My Awesome basic layout Report) .dropdown-menu a:contains(Duplicate)',
}, {
// open the duplicate report
trigger: '.o_kanban_record:contains(My Awesome basic layout Report copy(1))',
}, {
// switch to 'Report' tab
trigger: '.o_web_studio_report_editor_manager .o_web_studio_sidebar_header div[name="report"]',
}, {
// wait for the duplicated report to be correctly loaded
extra_trigger: '.o_web_studio_sidebar input[name="name"][value="My Awesome basic layout Report copy(1)"]',
// leave Studio
trigger: '.o_web_studio_leave > a.btn',
}]);
tour.register('web_studio_approval_tour', {
url: "/web",
test: true,
}, [{
// go to Apps menu
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
}, {
// open studio
trigger: '.o_main_navbar .o_web_studio_navbar_item',
extra_trigger: '.o_cp_switch_buttons',
}, {
// switch to form view editor
trigger: '.o_web_studio_views_icons > a[title="Form"]',
}, {
// click on first button it finds that has a node id
trigger: '.o_web_studio_form_view_editor button.o-web-studio-editor--element-clickable',
}, {
// enable approvals for the button
trigger: '.o_web_studio_sidebar label[for="studio_approval"]',
}, {
// set approval message
trigger: '.o_web_studio_sidebar_approval input[name*="approval_message"]',
run: 'text nope',
}, {
// add approval rule
trigger: '.o_web_studio_sidebar_approval .o_approval_new',
extra_trigger: '.o_web_studio_snackbar .fa-check',
}, {
// set domain on first rule
trigger: '.o_web_studio_sidebar_approval .o_approval_domain',
extra_trigger: '.o_studio_sidebar_approval_rule:eq(1)',
}, {
// set stupid domain that is always truthy
trigger: '.o_domain_debug_container textarea',
run: function () {
this.$anchor.focusIn();
this.$anchor.val('[["id", "!=", False]]');
this.$anchor.change();
}
}, {
// save domain and close modal
trigger:' .modal-footer .btn-primary',
}, {
// add second approval rule when the first is set
trigger: '.o_web_studio_sidebar_approval .o_approval_new',
extra_trigger: '.o_web_studio_snackbar .fa-check',
}, {
// enable 'force different users' for one rule (doesn't matter which)
trigger: '.o_web_studio_sidebar label[for*="exclusive_user"]',
extra_trigger: '.o_web_studio_snackbar .fa-check',
}, {
// leave studio
trigger: '.o_web_studio_leave > a.btn',
extra_trigger: '.o_web_studio_snackbar .fa-check',
}, {
// go back to kanban
trigger: '.o_menu_brand',
extra_trigger: '.o_web_client:not(.o_in_studio)'
}, {
// open first record (should be the one that was used, so the button should be there)
trigger: '.o_kanban_view .o_kanban_record .o_dropdown_kanban .dropdown-toggle',
}, {
trigger: '.o_kanban_view .o_kanban_record .o-dropdown--menu .dropdown-item',
},{
// try to do the action
trigger: 'button[studio_approval]',
}, {
// there should be a warning
trigger: '.o_notification.border-warning'
}, {
trigger: '.breadcrumb .o_back_button'
}]);
tour.register('web_studio_custom_field_tour', {
url: "/web",
test: true,
}, [{
// go to Apps menu
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
}, {
// click on the list view
trigger: '.o_switch_view.o_list',
}, {
// click on optional column dropdown
trigger: '.o_optional_columns_dropdown_toggle'
}, {
// click on add custom field
trigger: '.dropdown-item-studio'
}, {
// go to home menu
trigger: '.o_menu_toggle',
extra_trigger: '.o_web_client.o_in_studio'
}, {
//leave studio
trigger: '.o_web_studio_leave > a.btn'
}, {
// studio left.
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
extra_trigger: '.o_web_client:not(.o_in_studio)',
}]);
tour.register('web_studio_local_storage_tour', {
url: "/web",
test: true,
}, [{
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
run: function () {
localStorage.setItem('openStudioOnReload', "main");
window.location.reload();
},
}, {
// should be directly in studio mode
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
extra_trigger: '.o_web_client.o_in_studio'
}, {
trigger: '.o_menu_toggle',
}, {
trigger: '.o_web_studio_leave > a.btn',
}, {
// studio left.
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
extra_trigger: '.o_web_client:not(.o_in_studio)',
run: function () {
window.location.reload();
},
}, {
// studio left after refresh.
trigger: '.o_app[data-menu-xmlid="base.menu_management"]',
extra_trigger: '.o_web_client:not(.o_in_studio)'
}]);
});