diff --git a/platform/app/public/config/default.js b/platform/app/public/config/default.js index 504f623b2..c8d0bcec5 100644 --- a/platform/app/public/config/default.js +++ b/platform/app/public/config/default.js @@ -307,6 +307,7 @@ window.config = { selector: '.cornerstone-viewport-element', event: 'CORNERSTONE_TOOLS_MOUSE_WHEEL', }, + beforeShowPromise: () => waitForElement('.viewport-element'), /** buttons: [ { @@ -335,6 +336,7 @@ window.config = { selector: '.cornerstone-viewport-element', event: 'CORNERSTONE_TOOLS_MOUSE_UP', }, + beforeShowPromise: () => waitForElement('.viewport-element'), }, { id: 'pan', @@ -347,6 +349,7 @@ window.config = { selector: '.cornerstone-viewport-element', event: 'CORNERSTONE_TOOLS_MOUSE_UP', }, + beforeShowPromise: () => waitForElement('.viewport-element'), }, { id: 'windowing', @@ -359,6 +362,7 @@ window.config = { selector: '.cornerstone-viewport-element', event: 'CORNERSTONE_TOOLS_MOUSE_UP', }, + beforeShowPromise: () => waitForElement('.viewport-element'), }, { id: 'length', @@ -371,6 +375,8 @@ window.config = { selector: '[data-cy="MeasurementTools-split-button-primary"]', event: 'click', }, + beforeShowPromise: () => + waitForElement('[data-cy="MeasurementTools-split-button-primary]'), }, { id: 'drawAnnotation', @@ -383,6 +389,7 @@ window.config = { selector: 'body', event: 'event::measurement_added', }, + beforeShowPromise: () => waitForElement('.viewport-element'), }, { id: 'trackMeasurement', @@ -395,6 +402,7 @@ window.config = { selector: '[data-cy="prompt-begin-tracking-yes-btn"]', event: 'click', }, + beforeShowPromise: () => new Promise(resolve => setTimeout(resolve, 100)), }, { id: 'openMeasurementPanel', @@ -407,18 +415,20 @@ window.config = { selector: '#trackedMeasurements-btn', event: 'click', }, + beforeShowPromise: () => waitForElement('#trackedMeasurements-btn'), }, { id: 'scrollAwayFromMeasurement', text: 'Scroll the images using the mouse wheel away from the measurement.', attachTo: { element: '.viewport-element', - on: 'left-start', + on: 'top', }, advanceOn: { selector: '.cornerstone-viewport-element', event: 'CORNERSTONE_TOOLS_MOUSE_WHEEL', }, + beforeShowPromise: () => waitForElement('.viewport-element'), }, { id: 'jumpToMeasurement', @@ -431,6 +441,7 @@ window.config = { selector: '[data-cy="measurement-item"]', event: 'click', }, + beforeShowPromise: () => waitForElement('[data-cy="measurement-item"]'), }, { id: 'changeLayout', @@ -443,6 +454,7 @@ window.config = { selector: '[data-cy="Layout"]', event: 'click', }, + beforeShowPromise: () => waitForElement('[data-cy="Layout"]'), }, { id: 'selectLayout', @@ -455,6 +467,7 @@ window.config = { selector: '[data-cy="MPR"]', event: 'click', }, + beforeShowPromise: () => waitForElement('[data-cy="MPR"]'), }, ], tourOptions: { @@ -463,3 +476,20 @@ window.config = { }, ], }; + +function waitForElement(selector, maxAttempts = 20, interval = 25) { + return new Promise(resolve => { + let attempts = 0; + + const checkForElement = setInterval(() => { + const element = document.querySelector(selector); + + if (element || attempts >= maxAttempts) { + clearInterval(checkForElement); + resolve(); + } + + attempts++; + }, interval); + }); +} diff --git a/platform/ui-next/src/components/Onboarding/Onboarding.tsx b/platform/ui-next/src/components/Onboarding/Onboarding.tsx index f5fa39450..701a2a7b9 100644 --- a/platform/ui-next/src/components/Onboarding/Onboarding.tsx +++ b/platform/ui-next/src/components/Onboarding/Onboarding.tsx @@ -30,35 +30,16 @@ const Onboarding = () => { if (!tours) { return null; } - const pathname = location.pathname; const matchingTour = tours.find(tour => tour.route === pathname); - - if (matchingTour) { - const startTour = () => { - const tourInstance = new Shepherd.Tour(matchingTour.tourOptions); - matchingTour.steps.forEach(step => tourInstance.addStep(step)); - - const observer = new MutationObserver(() => { - const firstStepElement = document.querySelector( - matchingTour.steps[0].attachTo.element as string - ); - if (firstStepElement) { - observer.disconnect(); - tourInstance.start(); - markTourAsShown(matchingTour.id); - } - }); - - if (true) { - observer.observe(document.body, { childList: true, subtree: true }); - setTimeout(() => observer.disconnect(), 5000); - } - }; - - startTour(); + if (matchingTour && !hasTourBeenShown(matchingTour.id)) { + const tourInstance = new Shepherd.Tour(matchingTour.tourOptions); + matchingTour.steps.forEach(step => tourInstance.addStep(step)); + tourInstance.start(); + markTourAsShown(matchingTour.id); } }, [Shepherd, tours, location.pathname]); + return null; }; diff --git a/platform/ui/src/components/LayoutPreset/LayoutPreset.tsx b/platform/ui/src/components/LayoutPreset/LayoutPreset.tsx index f754b1aad..024c7a879 100644 --- a/platform/ui/src/components/LayoutPreset/LayoutPreset.tsx +++ b/platform/ui/src/components/LayoutPreset/LayoutPreset.tsx @@ -17,19 +17,13 @@ function LayoutPreset({ onClick={() => { onSelection(commandOptions); }} + data-cy={title} > - {title && ( -
- {title} -
- )} + {title &&
{title}
} ); }