[REF] web_tour: use OverlayContainer for pointers
**Before this commit** The tour_service make use of a custom main component TourPointerContainer. But there is really no good reason it does. **After this commit** The tour_service now make use of the overlay service. Advangates: - same place in DOM for all piece of UI that overlays the other elements. - should avoid potential stacking context issues - removal of a useless component, less code to maintain Part-of: odoo/odoo#137139
This commit is contained in:
@@ -1,11 +0,0 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { Component, xml } from "@odoo/owl";
|
||||
|
||||
export class TourPointerContainer extends Component {}
|
||||
TourPointerContainer.props = { pointers: Object };
|
||||
TourPointerContainer.template = xml`
|
||||
<t t-foreach="Object.values(props.pointers)" t-as="pointer" t-key="pointer.id">
|
||||
<t t-component="pointer.component" t-props="pointer.props"/>
|
||||
</t>
|
||||
`;
|
||||
@@ -8,7 +8,6 @@ import { registry } from "@web/core/registry";
|
||||
import { config as transitionConfig } from "@web/core/transition";
|
||||
import { session } from "@web/session";
|
||||
import { TourPointer } from "../tour_pointer/tour_pointer";
|
||||
import { TourPointerContainer } from "./tour_pointer_container";
|
||||
import { compileStepAuto, compileStepManual, compileTourToMacro } from "./tour_compilers";
|
||||
import { createPointerState } from "./tour_pointer_state";
|
||||
import { tourState } from "./tour_state";
|
||||
@@ -56,8 +55,8 @@ import { callWithUnloadCheck } from "./tour_utils";
|
||||
|
||||
export const tourService = {
|
||||
// localization dependency to make sure translations used by tours are loaded
|
||||
dependencies: ["orm", "effect", "ui", "localization"],
|
||||
start: async (_env, { orm, effect, ui }) => {
|
||||
dependencies: ["orm", "effect", "ui", "overlay", "localization"],
|
||||
start: async (_env, { orm, effect, ui, overlay }) => {
|
||||
await whenReady();
|
||||
|
||||
/** @type {{ [k: string]: Tour }} */
|
||||
@@ -108,13 +107,9 @@ export const tourService = {
|
||||
|
||||
const pointers = reactive({});
|
||||
|
||||
registry.category("main_components").add("TourPointerContainer", {
|
||||
Component: TourPointerContainer,
|
||||
props: { pointers },
|
||||
});
|
||||
|
||||
function createPointer(tourName, config) {
|
||||
const { state: pointerState, methods } = createPointerState();
|
||||
let remove;
|
||||
return {
|
||||
start() {
|
||||
pointers[tourName] = {
|
||||
@@ -122,8 +117,10 @@ export const tourService = {
|
||||
component: TourPointer,
|
||||
props: { pointerState, ...config },
|
||||
};
|
||||
remove = overlay.add(pointers[tourName].component, pointers[tourName].props);
|
||||
},
|
||||
stop() {
|
||||
remove?.();
|
||||
delete pointers[tourName];
|
||||
methods.destroy();
|
||||
},
|
||||
|
||||
@@ -112,21 +112,21 @@ QUnit.module("Tour service", (hooks) => {
|
||||
});
|
||||
const env = await makeTestEnv({});
|
||||
|
||||
const { Component: TourPointerContainer, props: tourPointerProps } = registry
|
||||
const { Component: OverlayContainer, props: overlayContainerProps } = registry
|
||||
.category("main_components")
|
||||
.get("TourPointerContainer");
|
||||
.get("OverlayContainer");
|
||||
|
||||
class Root extends Component {
|
||||
static components = { TourPointerContainer, Counter };
|
||||
static components = { OverlayContainer, Counter };
|
||||
static template = xml/*html*/ `
|
||||
<t>
|
||||
<Counter />
|
||||
<TourPointerContainer t-props="props.tourPointerProps" />
|
||||
<OverlayContainer t-props="props.overlayContainerProps" />
|
||||
</t>
|
||||
`;
|
||||
}
|
||||
|
||||
await mount(Root, target, { env, props: { tourPointerProps } });
|
||||
await mount(Root, target, { env, props: { overlayContainerProps } });
|
||||
env.services.tour_service.startTour("tour1", { mode: "manual" });
|
||||
await mock.advanceTime(800);
|
||||
assert.containsOnce(document.body, ".o_tour_pointer");
|
||||
@@ -149,21 +149,21 @@ QUnit.module("Tour service", (hooks) => {
|
||||
});
|
||||
const env = await makeTestEnv({});
|
||||
|
||||
const { Component: TourPointerContainer, props: tourPointerProps } = registry
|
||||
const { Component: OverlayContainer, props: overlayContainerProps } = registry
|
||||
.category("main_components")
|
||||
.get("TourPointerContainer");
|
||||
.get("OverlayContainer");
|
||||
|
||||
class Root extends Component {
|
||||
static components = { TourPointerContainer, Counter };
|
||||
static components = { OverlayContainer, Counter };
|
||||
static template = xml/*html*/ `
|
||||
<t>
|
||||
<Counter />
|
||||
<TourPointerContainer t-props="props.tourPointerProps" />
|
||||
<OverlayContainer t-props="props.overlayContainerProps" />
|
||||
</t>
|
||||
`;
|
||||
}
|
||||
|
||||
await mount(Root, target, { env, props: { tourPointerProps } });
|
||||
await mount(Root, target, { env, props: { overlayContainerProps } });
|
||||
env.services.tour_service.startTour("tour1", { mode: "manual" });
|
||||
await mock.advanceTime(750);
|
||||
assert.containsOnce(document.body, ".o_tour_pointer");
|
||||
@@ -182,21 +182,21 @@ QUnit.module("Tour service", (hooks) => {
|
||||
});
|
||||
const env = await makeTestEnv({});
|
||||
|
||||
const { Component: TourPointerContainer, props: tourPointerProps } = registry
|
||||
const { Component: OverlayContainer, props: overlayContainerProps } = registry
|
||||
.category("main_components")
|
||||
.get("TourPointerContainer");
|
||||
.get("OverlayContainer");
|
||||
|
||||
class Root extends Component {
|
||||
static components = { TourPointerContainer, Counter };
|
||||
static components = { OverlayContainer, Counter };
|
||||
static template = xml/*html*/ `
|
||||
<t>
|
||||
<Counter />
|
||||
<TourPointerContainer t-props="props.tourPointerProps" />
|
||||
<OverlayContainer t-props="props.overlayContainerProps" />
|
||||
</t>
|
||||
`;
|
||||
}
|
||||
|
||||
await mount(Root, target, { env, props: { tourPointerProps } });
|
||||
await mount(Root, target, { env, props: { overlayContainerProps } });
|
||||
env.services.tour_service.startTour("tour1", { mode: "manual" });
|
||||
env.services.tour_service.bus.addEventListener("STEP-CONSUMMED", ({ detail }) => {
|
||||
assert.step(`Tour ${detail.tour.name}, step ${detail.step.trigger}`);
|
||||
@@ -226,21 +226,21 @@ QUnit.module("Tour service", (hooks) => {
|
||||
});
|
||||
const env = await makeTestEnv({});
|
||||
|
||||
const { Component: TourPointerContainer, props: tourPointerProps } = registry
|
||||
const { Component: OverlayContainer, props: overlayContainerProps } = registry
|
||||
.category("main_components")
|
||||
.get("TourPointerContainer");
|
||||
.get("OverlayContainer");
|
||||
|
||||
class Root extends Component {
|
||||
static components = { TourPointerContainer, Counter };
|
||||
static components = { OverlayContainer, Counter };
|
||||
static template = xml/*html*/ `
|
||||
<t>
|
||||
<Counter />
|
||||
<TourPointerContainer t-props="props.tourPointerProps" />
|
||||
<OverlayContainer t-props="props.overlayContainerProps" />
|
||||
</t>
|
||||
`;
|
||||
}
|
||||
|
||||
await mount(Root, target, { env, props: { tourPointerProps } });
|
||||
await mount(Root, target, { env, props: { overlayContainerProps } });
|
||||
env.services.tour_service.startTour("tour1", { mode: "manual" });
|
||||
env.services.tour_service.startTour("tour2", { mode: "manual" });
|
||||
await mock.advanceTime(750);
|
||||
@@ -263,21 +263,21 @@ QUnit.module("Tour service", (hooks) => {
|
||||
});
|
||||
const env = await makeTestEnv({});
|
||||
|
||||
const { Component: TourPointerContainer, props: tourPointerProps } = registry
|
||||
const { Component: OverlayContainer, props: overlayContainerProps } = registry
|
||||
.category("main_components")
|
||||
.get("TourPointerContainer");
|
||||
.get("OverlayContainer");
|
||||
|
||||
class Root extends Component {
|
||||
static components = { TourPointerContainer, Counter };
|
||||
static components = { OverlayContainer, Counter };
|
||||
static template = xml/*html*/ `
|
||||
<t>
|
||||
<Counter />
|
||||
<TourPointerContainer t-props="props.tourPointerProps" />
|
||||
<OverlayContainer t-props="props.overlayContainerProps" />
|
||||
</t>
|
||||
`;
|
||||
}
|
||||
|
||||
await mount(Root, target, { env, props: { tourPointerProps } });
|
||||
await mount(Root, target, { env, props: { overlayContainerProps } });
|
||||
env.services.tour_service.startTour("tour1", { mode: "manual" });
|
||||
await mock.advanceTime(750);
|
||||
assert.containsOnce(target, ".o_tour_pointer");
|
||||
|
||||
Reference in New Issue
Block a user