diff --git a/src/renderer/src/pages.js b/src/renderer/src/pages.js index 796aa88b4..4cadf8964 100644 --- a/src/renderer/src/pages.js +++ b/src/renderer/src/pages.js @@ -144,6 +144,7 @@ const pages = { title: "Conversion Review", label: "Review conversion", section: sections[2], + sync: ["conversion"], }), upload: new GuidedUploadPage({ diff --git a/src/renderer/src/progress/index.js b/src/renderer/src/progress/index.js index 56a180f52..84fc87553 100644 --- a/src/renderer/src/progress/index.js +++ b/src/renderer/src/progress/index.js @@ -182,13 +182,13 @@ export const get = (name) => { ); }; -export function resume(name) { +export async function resume(name) { const global = this ? this.load(name) : get(name); let commandToResume = global["page-before-exit"] || "//details"; updateURLParams({ project: name }); - if (this) this.onTransition(commandToResume); + if (this) await this.onTransition(commandToResume); return commandToResume; } diff --git a/src/renderer/src/stories/Dashboard.js b/src/renderer/src/stories/Dashboard.js index bf7727d8d..e56b50273 100644 --- a/src/renderer/src/stories/Dashboard.js +++ b/src/renderer/src/stories/Dashboard.js @@ -242,7 +242,7 @@ export class Dashboard extends LitElement { this.page.set(toPass, false); - this.page.checkSyncState().then(() => { + this.page.checkSyncState().then(async () => { const projectName = info.globalState?.project?.name; this.subSidebar.header = projectName @@ -264,8 +264,8 @@ export class Dashboard extends LitElement { }); // Skip right over the page if configured as such - if (previous && previous.info.previous === this.page) this.page.onTransition(-1); - else this.page.onTransition(1); + if (previous && previous.info.previous === this.page) await this.page.onTransition(-1); + else await this.page.onTransition(1); } }); } @@ -328,13 +328,13 @@ export class Dashboard extends LitElement { if (typeof transition === "number") { const info = this.page.info; const sign = Math.sign(transition); - if (sign === 1) return this.setAttribute("activePage", info.next.info.id); - else if (sign === -1) return this.setAttribute("activePage", (info.previous ?? info.parent).info.id); // Default to back in time + if (sign === 1) transition = info.next.info.id; + else if (sign === -1) transition = (info.previous ?? info.parent).info.id; // Default to back in time } this.setAttribute("activePage", transition); - return await promise; + return promise; }; this.main.updatePages = () => { diff --git a/src/renderer/src/stories/pages/FormPage.js b/src/renderer/src/stories/pages/FormPage.js index 76b9068e0..8930e8d17 100644 --- a/src/renderer/src/stories/pages/FormPage.js +++ b/src/renderer/src/stories/pages/FormPage.js @@ -63,7 +63,7 @@ export class GuidedFormPage extends Page { onNext: async () => { await this.save(); // Save in case validation fails await this.form.validate(); // Validate the results of the form - this.to(1); + return this.to(1); }, }; diff --git a/src/renderer/src/stories/pages/Page.js b/src/renderer/src/stories/pages/Page.js index a8a0767d1..c077662eb 100644 --- a/src/renderer/src/stories/pages/Page.js +++ b/src/renderer/src/stories/pages/Page.js @@ -1,7 +1,7 @@ import { LitElement, html } from "lit"; import { openProgressSwal, runConversion } from "./guided-mode/options/utils.js"; import { get, save } from "../../progress/index.js"; -import { dismissNotification, notify } from "../../dependencies/globals.js"; +import { dismissNotification, isStorybook, notify } from "../../dependencies/globals.js"; import { randomizeElements, mapSessions, merge } from "./utils.js"; import { ProgressBar } from "../ProgressBar"; @@ -134,9 +134,10 @@ export class Page extends LitElement { // Indicate conversion has run successfully const { desyncedData } = this.info.globalState; + if (!desyncedData) this.info.globalState.desyncedData = {}; + if (desyncedData) { - delete desyncedData[key]; - if (Object.keys(desyncedData).length === 0) delete this.info.globalState.desyncedData; + desyncedData[key] = false; await this.save({}, false); } } @@ -253,18 +254,18 @@ export class Page extends LitElement { checkSyncState = async (info = this.info, sync = info.sync) => { if (!sync) return; + if (isStorybook) return; const { desyncedData } = info.globalState; - if (desyncedData) { - return Promise.all( - sync.map((k) => { - if (desyncedData[k]) { - if (k === "conversion") return this.convert(); - else if (k === "preview") return this.convert({ preview: true }); - } - }) - ); - } + + return Promise.all( + sync.map((k) => { + if (desyncedData?.[k] !== false) { + if (k === "conversion") return this.convert(); + else if (k === "preview") return this.convert({ preview: true }); + } + }) + ); }; updateSections = () => { diff --git a/src/renderer/src/stories/pages/guided-mode/GuidedStart.stories.js b/src/renderer/src/stories/pages/guided-mode/GuidedStart.stories.js deleted file mode 100644 index 1a812dcb2..000000000 --- a/src/renderer/src/stories/pages/guided-mode/GuidedStart.stories.js +++ /dev/null @@ -1,14 +0,0 @@ -import { globalState, PageTemplate } from "./storyStates"; - -export default { - title: "Pages/Guided Mode/Start", - parameters: { - chromatic: { disableSnapshot: false }, - }, -}; - -export const Default = PageTemplate.bind({}); -Default.args = { - activePage: "//start", - globalState, -}; diff --git a/tests/e2e/e2e.test.ts b/tests/e2e/e2e.test.ts index f7b0f2343..44ba41161 100644 --- a/tests/e2e/e2e.test.ts +++ b/tests/e2e/e2e.test.ts @@ -144,17 +144,8 @@ describe('E2E Test', () => { }, { upload_to_dandi: true }) - await toNextPage('structure') // Save data without a popup await to('//conversion') - - // Do not prompt to save - await evaluate(() => { - const dashboard = document.querySelector('nwb-dashboard') - const page = dashboard.page - page.unsavedUpdates = false - }) - - await to('//upload') // NOTE: It would be nice to avoid having to re-run the conversion... + await to('//upload') }) diff --git a/tests/e2e/workflow.ts b/tests/e2e/workflow.ts index fd097e01a..6fadea192 100644 --- a/tests/e2e/workflow.ts +++ b/tests/e2e/workflow.ts @@ -1,4 +1,4 @@ -import { describe, test } from "vitest" +import { describe, expect, test } from "vitest" import { sleep } from '../puppeteer' @@ -429,21 +429,30 @@ export default async function runWorkflow(name, workflow, identifier) { test('Review NWB Inspector output', async () => { - await takeScreenshot(join(identifier, 'inspect-page'), 5000) // Finish file inspection and allow full load of Neurosift page + await takeScreenshot(join(identifier, 'inspect-page'), 5000) // Allow for the completion of file validation await toNextPage('preview') }) test('Review Neurosift visualization', async () => { - await takeScreenshot(join(identifier, 'preview-page'), 1000) // Finish loading Neurosift + await takeScreenshot(join(identifier, 'preview-page'), 1000) // Allow full load of Neurosift page await toNextPage('conversion') }) test('View the conversion results', async () => { + await takeScreenshot(join(identifier, 'conversion-results-page'), 1000) + + const conversionCompleted = await evaluate(() => { + const dashboard = document.querySelector('nwb-dashboard') + const page = dashboard.page + return !!page.info.globalState.conversion + }) - await takeScreenshot(join(identifier, 'conversion-results-page'), 300) if (workflow.upload_to_dandi) await toNextPage('upload') else await toNextPage('') + + expect(conversionCompleted).toBe(true) + })