diff --git a/src/pages/workflows/workflow/WorkflowSummary.ts b/src/pages/workflows/workflow/WorkflowSummary.ts index d479b214bc..51e16cd462 100644 --- a/src/pages/workflows/workflow/WorkflowSummary.ts +++ b/src/pages/workflows/workflow/WorkflowSummary.ts @@ -3,15 +3,17 @@ import _ from 'lodash/fp'; import { Fragment, useState } from 'react'; import { div, h, h2, span } from 'react-hyperscript-helpers'; import * as breadcrumbs from 'src/components/breadcrumbs'; -import { ButtonPrimary, Link } from 'src/components/common'; +import { ButtonPrimary, Link, spinnerOverlay } from 'src/components/common'; import { icon } from 'src/components/icons'; import { MarkdownViewer, newWindowLinkRenderer } from 'src/components/markdown'; import { TooltipCell } from 'src/components/table'; +import { Ajax } from 'src/libs/ajax'; import { getConfig } from 'src/libs/config'; import { withErrorReporting } from 'src/libs/error'; -import { forwardRefWithName, useStore } from 'src/libs/react-utils'; +import { forwardRefWithName, useCancellation, useStore } from 'src/libs/react-utils'; import { snapshotStore } from 'src/libs/state'; import * as Style from 'src/libs/style'; +import * as Utils from 'src/libs/utils'; import { WorkflowRightBoxSection } from 'src/pages/workflows/components/WorkflowRightBoxSection'; import { PermissionsModal } from 'src/pages/workflows/workflow/common/PermissionsModal'; import { wrapWorkflows } from 'src/pages/workflows/workflow/WorkflowWrapper'; @@ -32,10 +34,16 @@ export const BaseWorkflowSummary = () => { const persistenceId = `workflows/${namespace}/${name}/dashboard`; const [importUrlCopied, setImportUrlCopied] = useState(); const [permissionsModalOpen, setPermissionsModalOpen] = useState(false); + const [loading, setLoading] = useState(false); + const signal: AbortSignal = useCancellation(); const importUrl = `${ getConfig().orchestrationUrlRoot }/ga4gh/v1/tools/${namespace}:${name}/versions/${snapshotId}/plain-WDL/descriptor`; + const refresh = Utils.withBusyState(setLoading, async () => { + snapshotStore.set(await Ajax(signal).Methods.method(namespace, name, snapshotId).get()); + }); + return div({ style: { flex: 1, display: 'flex' }, role: 'tabpanel' }, [ div({ style: Style.dashboard.leftBox }, [ synopsis && @@ -119,7 +127,10 @@ export const BaseWorkflowSummary = () => { name, selectedSnapshot: snapshotId, setPermissionsModalOpen, + refresh, + setLoading, }), + loading && spinnerOverlay, ]); }; diff --git a/src/pages/workflows/workflow/common/PermissionsModal.test.tsx b/src/pages/workflows/workflow/common/PermissionsModal.test.tsx index 35513ee4d6..487088887e 100644 --- a/src/pages/workflows/workflow/common/PermissionsModal.test.tsx +++ b/src/pages/workflows/workflow/common/PermissionsModal.test.tsx @@ -54,6 +54,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -75,6 +77,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -97,6 +101,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -135,6 +141,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -169,6 +177,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -188,6 +198,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -226,6 +238,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); @@ -259,6 +273,8 @@ describe('PermissionsModal', () => { snapshotOrNamespace='Snapshot' selectedSnapshot={3} setPermissionsModalOpen={jest.fn()} + refresh={jest.fn()} + setLoading={jest.fn()} /> ); }); diff --git a/src/pages/workflows/workflow/common/PermissionsModal.tsx b/src/pages/workflows/workflow/common/PermissionsModal.tsx index 1b22c0c411..3e30196123 100644 --- a/src/pages/workflows/workflow/common/PermissionsModal.tsx +++ b/src/pages/workflows/workflow/common/PermissionsModal.tsx @@ -37,6 +37,8 @@ type WorkflowPermissionsModalProps = { name: string; selectedSnapshot: number; setPermissionsModalOpen: (b: boolean) => void; + refresh: () => void; + setLoading: (b: boolean) => void; }; type UserProps = { @@ -166,7 +168,8 @@ const CurrentUsers = (props: CurrentUserProps) => { }; export const PermissionsModal = (props: WorkflowPermissionsModalProps) => { - const { snapshotOrNamespace, namespace, name, selectedSnapshot, setPermissionsModalOpen } = props; + const { snapshotOrNamespace, namespace, name, selectedSnapshot, setPermissionsModalOpen, refresh, setLoading } = + props; const signal: AbortSignal = useCancellation(); const [searchValue, setSearchValue] = useState(''); const [permissions, setPermissions] = useState([]); @@ -207,14 +210,14 @@ export const PermissionsModal = (props: WorkflowPermissionsModalProps) => { const updatePublicUser = (v) => { if (publicUser) { - permissions.map((pub) => { + permissions.map((user) => { if (v === false) { - if (pub.user === 'public') { - Object.assign(pub, { user: 'public', role: 'NO ACCESS' }); + if (user.user === 'public') { + Object.assign(user, { user: 'public', role: 'NO ACCESS' }); } } else if (v === true) { - if (pub.user === 'public') { - Object.assign(pub, { user: 'public', role: 'READER' }); + if (user.user === 'public') { + Object.assign(user, { user: 'public', role: 'READER' }); } } @@ -232,10 +235,12 @@ export const PermissionsModal = (props: WorkflowPermissionsModalProps) => { try { await Ajax(signal).Methods.method(namespace, name, selectedSnapshot).setPermissions(permissionUpdates); - window.location.reload(); + setLoading(true); + refresh(); setPermissionsModalOpen(false); } catch (error) { await reportError('Error saving permissions.', error); + setLoading(false); setPermissionsModalOpen(false); } });