1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/knowledge/static/tests/tours/knowledge_tour_utils.js
2024-12-10 09:04:09 +07:00

236 lines
7.8 KiB
JavaScript

/** @odoo-module */
import { SORTABLE_TOLERANCE } from "@knowledge/components/sidebar/sidebar";
import { stepUtils } from "@web_tour/tour_service/tour_utils";
import { setSelection, boundariesIn } from "@web_editor/js/editor/odoo-editor/src/utils/utils";
import { insertText } from "@web/../tests/utils";
export const changeInternalPermission = (permission) => {
const target = document.querySelector('.o_permission[aria-label="Internal Permission"]');
target.value = permission;
target.dispatchEvent(new Event("change"));
};
/**
* Drag&drop an article in the sidebar
* @param {$.Element} element
* @param {$.Element} target
*/
export const dragAndDropArticle = ($element, $target) => {
const elementOffset = $element.offset();
const targetOffset = $target.offset();
// If the target is under the element, the cursor needs to be in the upper
// part of the target to trigger the move. If it is above, the cursor needs
// to be in the bottom part.
const targetY = targetOffset.top + (targetOffset.top > elementOffset.top ? ($target.outerHeight() - 1) : 0);
const element = $element[0].closest("li");
const target = $target[0];
element.dispatchEvent(
new PointerEvent("pointerdown", {
bubbles: true,
which: 1,
clientX: elementOffset.right,
clientY: elementOffset.top,
})
);
// Initial movement starting the drag sequence
element.dispatchEvent(
new PointerEvent("pointermove", {
bubbles: true,
which: 1,
clientX: elementOffset.right,
clientY: elementOffset.top + SORTABLE_TOLERANCE,
})
);
// Timeouts because sidebar onMove is debounced
setTimeout(() => {
target.dispatchEvent(
new PointerEvent("pointermove", {
bubbles: true,
which: 1,
clientX: targetOffset.right,
clientY: targetY,
})
);
setTimeout(() => {
element.dispatchEvent(
new PointerEvent("pointerup", {
bubbles: true,
which: 1,
clientX: targetOffset.right,
clientY: targetY,
})
);
}, 200);
}, 200);
};
/**
* Steps to insert an articleLink for the given article, in the first editable
* html_field found in the given container selector (should have a paragraph
* as its last element, and the link will be inserted at the position at index
* offset in the paragraph).
*
* @param {string} htmlFieldContainerSelector jquery selector for the container
* @param {string} articleName name of the article to insert a link for
* @param {integer} offset position of the command call in the paragraph
* @returns {Array} tour steps
*/
export function appendArticleLink(htmlFieldContainerSelector, articleName, offset=0) {
return [{ // open the command bar
trigger: `${htmlFieldContainerSelector} .odoo-editor-editable > p:last-child`,
run: function () {
openCommandBar(this.$anchor[0], offset);
},
}, { // click on the /article command
trigger: '.oe-powerbox-commandName:contains(Article)',
run: 'click',
in_modal: false,
}, { // select an article in the list
trigger: `.o_select_menu_item:contains(${articleName})`,
run: 'click',
in_modal: false,
}, { // wait for the choice to be registered
trigger: `.o_select_menu_toggler_slot:contains(${articleName})`,
run: () => {},
}, { // click on the "Insert Link" button
trigger: '.modal-dialog:contains(Link an Article) .modal-footer button.btn-primary',
run: 'click'
}];
}
/**
* Ensure that the tour does not end on the Knowledge form view by returning to
* the home menu.
*/
export function endKnowledgeTour() {
return [
stepUtils.toggleHomeMenu(), {
trigger: '.o_app[data-menu-xmlid="knowledge.knowledge_menu_root"]',
run: () => {},
}
];
}
export function makeVisible(selector) {
const el = document.querySelector(selector);
if (el) {
el.style.setProperty("visibility", "visible", "important");
el.style.setProperty("opacity", "1", "important");
el.style.setProperty("display", "block", "important");
}
}
/**
* Opens the power box of the editor
* @param {HTMLElement} paragraph
* @param {integer} offset position of the command call in the paragraph
*/
export function openCommandBar(paragraph, offset=0) {
const sel = document.getSelection();
sel.removeAllRanges();
const range = document.createRange();
range.setStart(paragraph, offset);
range.setEnd(paragraph, offset);
sel.addRange(range);
paragraph.dispatchEvent(
new KeyboardEvent("keydown", {
key: "/",
})
);
const slash = document.createTextNode("/");
paragraph.prepend(slash);
sel.removeAllRanges();
range.setStart(slash, 1);
range.setEnd(slash, 1);
sel.addRange(range);
paragraph.dispatchEvent(
new InputEvent("input", {
inputType: "insertText",
data: "/",
bubbles: true,
})
);
paragraph.dispatchEvent(
new KeyboardEvent("keyup", {
key: "/",
})
);
}
export function createNewCommentSteps(text) {
return [{
// Select some text in the first paragraph
trigger: '.note-editable p.to-select',
run: function () {
setSelection(...boundariesIn(this.$anchor[0]));
}
}, {
// Trigger comment creation with the editor toolbar
trigger: '.oe-toolbar div[id="comment-line"]',
}, {
trigger: '.o_knowledge_comments_popover, .o_knowledge_comment_box',
run: () => {}
}, {
trigger: '.o_knowledge_comments_popover .o-mail-Composer-input, .o-mail-Composer-input',
run: async () => {
await insertText('.o-mail-Composer-input', text || 'Hello World');
}
}, {
// Send comment
trigger: '.o_knowledge_comments_popover .o-mail-Composer-send:not([disabled=""]), .o-mail-Composer-send:not([disabled=""])'
}, {
trigger: '.o_knowledge_comment_box[data-id] .o_knowledge_comment_small_ui img, .o_knowledge_comment_box[data-id]',
run: () => {}
}, {
trigger: '.o_knowledge_comment_box[data-id] .o_knowledge_comment_small_ui img, .o_knowledge_comment_box[data-id]',
run: function () {
this.$anchor[0].querySelector('.o_knowledge_comment_small_ui img')?.click();
}
}, {
trigger: `.o-mail-Thread :contains(${text || 'Hello World'})`,
run: () => {}
},];
}
export function answerThreadSteps(text) {
return [
{
trigger: '.o_knowledge_comments_popover, .o_knowledge_comment_box',
}, {
trigger: '.o_knowledge_comments_popover .o-mail-Composer-input, .o-mail-Composer-input',
run: async () => {
await insertText('.o-mail-Composer-input', text || 'Hello World');
}
}, {
// Send comment
trigger: '.o_knowledge_comments_popover .o-mail-Composer-send:not([disabled=""]), .o-mail-Composer-send:not([disabled=""])'
}, {
trigger: `.o-mail-Thread :contains(${text || 'Hello World'})`,
run: () => {}
}, {
trigger: '.note-editable'
}, {
trigger: '.o_knowledge_comment_box:not(.commenting)',
run: () => {}
}
];
}
export function resolveCommentSteps() {
return [
{
trigger: '.o-mail-Message-actions',
run: () => {
makeVisible('.o-mail-Message-actions');
}
}, {// Resolve Thread
trigger: 'button[name="closeThread"]'
}
];
}