From 4530e2fcf4cac004af67cecddefc742a83c82b16 Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Fri, 12 Jun 2020 17:54:31 -0300 Subject: [PATCH] 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 --- .../collection-panel-files.tsx | 16 ++++++++++++---- .../collection-panel-files-actions.ts | 5 +++++ src/views/collection-panel/collection-panel.tsx | 11 ++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) 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; -- 2.30.2