From: Lucas Di Pentima Date: Fri, 12 Jun 2020 20:54:31 +0000 (-0300) Subject: 15610: Shows status indicator while loading collection's file data. X-Git-Tag: 2.1.0~22^2~12 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/4530e2fcf4cac004af67cecddefc742a83c82b16 15610: Shows status indicator while loading collection's file data. This includes the general app progress indicator, and a '(loading files...)' text label where the file tree should be rendered. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- diff --git a/src/components/collection-panel-files/collection-panel-files.tsx b/src/components/collection-panel-files/collection-panel-files.tsx index 48b36be1..3a2d55fb 100644 --- a/src/components/collection-panel-files/collection-panel-files.tsx +++ b/src/components/collection-panel-files/collection-panel-files.tsx @@ -13,6 +13,7 @@ import { DownloadIcon } from '~/components/icon/icon'; export interface CollectionPanelFilesProps { items: Array>; isWritable: boolean; + isLoading: boolean; onUploadDataClick: () => void; onItemMenuOpen: (event: React.MouseEvent, item: TreeItem, isWritable: boolean) => void; onOptionsMenuOpen: (event: React.MouseEvent, isWritable: boolean) => void; @@ -22,7 +23,7 @@ export interface CollectionPanelFilesProps { currentItemUuid?: string; } -type CssRules = 'root' | 'cardSubheader' | 'nameHeader' | 'fileSizeHeader' | 'uploadIcon' | 'button'; +type CssRules = 'root' | 'cardSubheader' | 'nameHeader' | 'fileSizeHeader' | 'uploadIcon' | 'button' | 'centeredLabel'; const styles: StyleRulesCallback = theme => ({ root: { @@ -44,12 +45,17 @@ const styles: StyleRulesCallback = theme => ({ button: { marginRight: -theme.spacing.unit, marginTop: '0px' - } + }, + centeredLabel: { + fontSize: '0.875rem', + textAlign: 'center' + }, }); export const CollectionPanelFiles = withStyles(styles)( - ({ onItemMenuOpen, onOptionsMenuOpen, onUploadDataClick, classes, isWritable, ...treeProps }: CollectionPanelFilesProps & WithStyles) => + ({ onItemMenuOpen, onOptionsMenuOpen, onUploadDataClick, classes, + isWritable, isLoading, ...treeProps }: CollectionPanelFilesProps & WithStyles) => - onItemMenuOpen(ev, item, isWritable)} {...treeProps} /> + { isLoading + ?
(loading files...)
+ : onItemMenuOpen(ev, item, isWritable)} {...treeProps} /> }
); diff --git a/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts b/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts index 9d3ae861..fe93eef2 100644 --- a/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts +++ b/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts @@ -14,6 +14,7 @@ import { filterCollectionFilesBySelection } from './collection-panel-files-state import { startSubmit, stopSubmit, initialize, FormErrors } from 'redux-form'; import { getDialog } from "~/store/dialog/dialog-reducer"; import { getFileFullPath, sortFilesTree } from "~/services/collection-service/collection-service-files-response"; +import { progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions"; export const collectionPanelFilesAction = unionize({ SET_COLLECTION_FILES: ofType(), @@ -25,8 +26,11 @@ export const collectionPanelFilesAction = unionize({ export type CollectionPanelFilesAction = UnionOf; +export const COLLECTION_PANEL_LOAD_FILES = 'collectionPanelLoadFiles'; + export const loadCollectionFiles = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + dispatch(progressIndicatorActions.START_WORKING(COLLECTION_PANEL_LOAD_FILES)); const files = await services.collectionService.files(uuid); // Given the array of directories and files, create the appropriate tree nodes, @@ -35,6 +39,7 @@ export const loadCollectionFiles = (uuid: string) => const sorted = sortFilesTree(tree); const mapped = mapTreeValues(services.collectionService.extendFileURL)(sorted); dispatch(collectionPanelFilesAction.SET_COLLECTION_FILES(mapped)); + dispatch(progressIndicatorActions.STOP_WORKING(COLLECTION_PANEL_LOAD_FILES)); }; export const removeCollectionFiles = (filePaths: string[]) => diff --git a/src/views/collection-panel/collection-panel.tsx b/src/views/collection-panel/collection-panel.tsx index 36625387..27a68541 100644 --- a/src/views/collection-panel/collection-panel.tsx +++ b/src/views/collection-panel/collection-panel.tsx @@ -28,6 +28,8 @@ import { IllegalNamingWarning } from '~/components/warning/warning'; import { GroupResource } from '~/models/group'; import { UserResource } from '~/models/user'; import { getUserUuid } from '~/common/getuser'; +import { getProgressIndicator } from '~/store/progress-indicator/progress-indicator-reducer'; +import { COLLECTION_PANEL_LOAD_FILES } from '~/store/collection-panel/collection-panel-files/collection-panel-files-actions'; type CssRules = 'card' | 'iconHeader' | 'tag' | 'label' | 'value' | 'link' | 'centeredLabel' | 'readOnlyIcon'; @@ -70,6 +72,7 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ interface CollectionPanelDataProps { item: CollectionResource; isWritable: boolean; + isLoadingFiles: boolean; } type CollectionPanelProps = CollectionPanelDataProps & DispatchProp @@ -88,11 +91,13 @@ export const CollectionPanel = withStyles(styles)( isWritable = itemOwner.writableBy.indexOf(currentUserUUID || '') >= 0; } } - return { item, isWritable }; + const loadingFilesIndicator = getProgressIndicator(COLLECTION_PANEL_LOAD_FILES)(state.progressIndicator); + const isLoadingFiles = loadingFilesIndicator && loadingFilesIndicator!.working || false; + return { item, isWritable, isLoadingFiles }; })( class extends React.Component { render() { - const { classes, item, dispatch, isWritable } = this.props; + const { classes, item, dispatch, isWritable, isLoadingFiles } = this.props; return item ? <> @@ -183,7 +188,7 @@ export const CollectionPanel = withStyles(styles)(
- +
: null;