[ARVADOS-WORKBENCH2] updated: 1.2.0-379-g5e8a5a1
Git user
git at public.curoverse.com
Mon Sep 17 16:30:15 EDT 2018
Summary of changes:
src/components/data-explorer/data-explorer.tsx | 4 ++-
src/components/data-table/data-table.tsx | 5 ++--
src/store/data-explorer/data-explorer-reducer.ts | 1 +
.../favorite-panel-middleware-service.ts | 5 +++-
.../progress-indicator-actions.ts | 1 +
.../progress-indicator-reducer.ts | 6 +++-
.../project-panel-middleware-service.ts | 4 +++
.../trash-panel/trash-panel-middleware-service.ts | 4 +++
.../data-explorer/data-explorer.tsx | 4 ++-
src/views/favorite-panel/favorite-panel.tsx | 29 ++++++++------------
src/views/project-panel/project-panel.tsx | 32 ++++++++++------------
src/views/trash-panel/trash-panel.tsx | 28 ++++++++-----------
12 files changed, 65 insertions(+), 58 deletions(-)
via 5e8a5a1c42226e0dd3aceaf4825d870a3786c5d1 (commit)
from 3fd7d22747e43fd810c1eace852ae5b184b06bde (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit 5e8a5a1c42226e0dd3aceaf4825d870a3786c5d1
Author: Daniel Kos <daniel.kos at contractors.roche.com>
Date: Mon Sep 17 22:30:10 2018 +0200
Change default table view to be displayed only after data fetch
Feature #14186
Arvados-DCO-1.1-Signed-off-by: Daniel Kos <daniel.kos at contractors.roche.com>
diff --git a/src/components/data-explorer/data-explorer.tsx b/src/components/data-explorer/data-explorer.tsx
index 58507fb..66b9c35 100644
--- a/src/components/data-explorer/data-explorer.tsx
+++ b/src/components/data-explorer/data-explorer.tsx
@@ -33,6 +33,7 @@ interface DataExplorerDataProps<T> {
page: number;
contextMenuColumn: boolean;
dataTableDefaultView?: React.ReactNode;
+ working?: boolean;
}
interface DataExplorerActionProps<T> {
@@ -60,7 +61,7 @@ export const DataExplorer = withStyles(styles)(
}
render() {
const {
- columns, onContextMenu, onFiltersChange, onSortToggle, extractKey,
+ columns, onContextMenu, onFiltersChange, onSortToggle, working, extractKey,
rowsPerPage, rowsPerPageOptions, onColumnToggle, searchValue, onSearch,
items, itemsAvailable, onRowClick, onRowDoubleClick, classes,
dataTableDefaultView
@@ -87,6 +88,7 @@ export const DataExplorer = withStyles(styles)(
onFiltersChange={onFiltersChange}
onSortToggle={onSortToggle}
extractKey={extractKey}
+ working={working}
defaultView={dataTableDefaultView}
/>
<Toolbar>
diff --git a/src/components/data-table/data-table.tsx b/src/components/data-table/data-table.tsx
index 65531a5..25d81c6 100644
--- a/src/components/data-table/data-table.tsx
+++ b/src/components/data-table/data-table.tsx
@@ -19,6 +19,7 @@ export interface DataTableDataProps<T> {
onSortToggle: (column: DataColumn<T>) => void;
onFiltersChange: (filters: DataTableFilterItem[], column: DataColumn<T>) => void;
extractKey?: (item: T) => React.Key;
+ working?: boolean;
defaultView?: React.ReactNode;
}
@@ -63,7 +64,7 @@ export const DataTable = withStyles(styles)(
{items.map(this.renderBodyRow)}
</TableBody>
</Table>
- {items.length === 0 && this.renderNoItemsPlaceholder()}
+ {items.length === 0 && this.props.working !== undefined && !this.props.working && this.renderNoItemsPlaceholder()}
</div>
</div>;
}
@@ -71,7 +72,7 @@ export const DataTable = withStyles(styles)(
renderNoItemsPlaceholder = () => {
return this.props.defaultView
? this.props.defaultView
- : <DataTableDefaultView />;
+ : <DataTableDefaultView/>;
}
renderHeadCell = (column: DataColumn<T>, index: number) => {
diff --git a/src/store/data-explorer/data-explorer-reducer.ts b/src/store/data-explorer/data-explorer-reducer.ts
index cc80024..d059d37 100644
--- a/src/store/data-explorer/data-explorer-reducer.ts
+++ b/src/store/data-explorer/data-explorer-reducer.ts
@@ -15,6 +15,7 @@ export interface DataExplorer {
rowsPerPage: number;
rowsPerPageOptions: number[];
searchValue: string;
+ working?: boolean;
}
export const initialDataExplorer: DataExplorer = {
diff --git a/src/store/favorite-panel/favorite-panel-middleware-service.ts b/src/store/favorite-panel/favorite-panel-middleware-service.ts
index c385309..96f6664 100644
--- a/src/store/favorite-panel/favorite-panel-middleware-service.ts
+++ b/src/store/favorite-panel/favorite-panel-middleware-service.ts
@@ -17,6 +17,7 @@ import { LinkResource } from "~/models/link";
import { GroupContentsResource, GroupContentsResourcePrefix } from "~/services/groups-service/groups-service";
import { resourcesActions } from "~/store/resources/resources-actions";
import { snackbarActions } from '~/store/snackbar/snackbar-actions';
+import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions.ts';
import { getDataExplorer } from "~/store/data-explorer/data-explorer-reducer";
import { loadMissingProcessesInformation } from "~/store/project-panel/project-panel-middleware-service";
@@ -30,7 +31,6 @@ export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareServic
if (!dataExplorer) {
api.dispatch(favoritesPanelDataExplorerIsNotSet());
} else {
-
const columns = dataExplorer.columns as DataColumns<string, FavoritePanelFilter>;
const sortColumn = dataExplorer.columns.find(c => c.sortDirection !== SortDirection.NONE);
const typeFilters = this.getColumnFilters(columns, FavoritePanelColumnNames.TYPE);
@@ -50,6 +50,7 @@ export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareServic
.addOrder(direction, "name", GroupContentsResourcePrefix.PROJECT);
}
try {
+ api.dispatch(progressIndicatorActions.START(this.getId()));
const response = await this.services.favoriteService
.list(this.services.authService.getUuid()!, {
limit: dataExplorer.rowsPerPage,
@@ -61,6 +62,7 @@ export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareServic
.addILike("name", dataExplorer.searchValue)
.getFilters()
});
+ api.dispatch(progressIndicatorActions.PERSIST_STOP(this.getId()));
api.dispatch(resourcesActions.SET_RESOURCES(response.items));
await api.dispatch<any>(loadMissingProcessesInformation(response.items));
api.dispatch(favoritePanelActions.SET_ITEMS({
@@ -71,6 +73,7 @@ export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareServic
}));
api.dispatch<any>(updateFavorites(response.items.map(item => item.uuid)));
} catch (e) {
+ api.dispatch(progressIndicatorActions.PERSIST_STOP(this.getId()));
api.dispatch(favoritePanelActions.SET_ITEMS({
items: [],
itemsAvailable: 0,
diff --git a/src/store/progress-indicator/progress-indicator-actions.ts b/src/store/progress-indicator/progress-indicator-actions.ts
index 3712e41..144f20b 100644
--- a/src/store/progress-indicator/progress-indicator-actions.ts
+++ b/src/store/progress-indicator/progress-indicator-actions.ts
@@ -7,6 +7,7 @@ import { unionize, ofType, UnionOf } from "~/common/unionize";
export const progressIndicatorActions = unionize({
START: ofType<string>(),
STOP: ofType<string>(),
+ PERSIST_STOP: ofType<string>(),
TOGGLE: ofType<{ id: string, working: boolean }>()
});
diff --git a/src/store/progress-indicator/progress-indicator-reducer.ts b/src/store/progress-indicator/progress-indicator-reducer.ts
index f6a7347..4889bac 100644
--- a/src/store/progress-indicator/progress-indicator-reducer.ts
+++ b/src/store/progress-indicator/progress-indicator-reducer.ts
@@ -15,11 +15,15 @@ export const progressIndicatorReducer = (state: ProgressIndicatorState = initial
return progressIndicatorActions.match(action, {
START: id => startWorking(id),
STOP: id => stopWorking(id),
+ PERSIST_STOP: id => state.map(p => ({
+ id,
+ working: p.id === id ? false : p.working
+ })),
TOGGLE: ({ id, working }) => working ? startWorking(id) : stopWorking(id),
default: () => state,
});
};
export function isSystemWorking(state: ProgressIndicatorState): boolean {
- return state.length > 0;
+ return state.length > 0 && state.reduce((working, p) => working ? true : p.working, false);
}
diff --git a/src/store/project-panel/project-panel-middleware-service.ts b/src/store/project-panel/project-panel-middleware-service.ts
index 4b4ec26..89db436 100644
--- a/src/store/project-panel/project-panel-middleware-service.ts
+++ b/src/store/project-panel/project-panel-middleware-service.ts
@@ -18,6 +18,7 @@ import { ProjectResource } from "~/models/project";
import { updateResources } from "~/store/resources/resources-actions";
import { getProperty } from "~/store/properties/properties";
import { snackbarActions } from '../snackbar/snackbar-actions';
+import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions.ts';
import { DataExplorer, getDataExplorer } from '../data-explorer/data-explorer-reducer';
import { ListResults } from '~/services/common-service/common-resource-service';
import { loadContainers } from '../processes/processes-actions';
@@ -38,12 +39,15 @@ export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService
api.dispatch(projectPanelDataExplorerIsNotSet());
} else {
try {
+ api.dispatch(progressIndicatorActions.START(this.getId()));
const response = await this.services.groupsService.contents(projectUuid, getParams(dataExplorer));
+ api.dispatch(progressIndicatorActions.PERSIST_STOP(this.getId()));
api.dispatch<any>(updateFavorites(response.items.map(item => item.uuid)));
api.dispatch(updateResources(response.items));
await api.dispatch<any>(loadMissingProcessesInformation(response.items));
api.dispatch(setItems(response));
} catch (e) {
+ api.dispatch(progressIndicatorActions.PERSIST_STOP(this.getId()));
api.dispatch(couldNotFetchProjectContents());
}
}
diff --git a/src/store/trash-panel/trash-panel-middleware-service.ts b/src/store/trash-panel/trash-panel-middleware-service.ts
index 6e8fa54..968656d 100644
--- a/src/store/trash-panel/trash-panel-middleware-service.ts
+++ b/src/store/trash-panel/trash-panel-middleware-service.ts
@@ -21,6 +21,7 @@ import { ProjectPanelColumnNames } from "~/views/project-panel/project-panel";
import { updateFavorites } from "~/store/favorites/favorites-actions";
import { snackbarActions } from "~/store/snackbar/snackbar-actions";
import { updateResources } from "~/store/resources/resources-actions";
+import { progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions";
export class TrashPanelMiddlewareService extends DataExplorerMiddlewareService {
constructor(private services: ServiceRepository, id: string) {
@@ -47,6 +48,7 @@ export class TrashPanelMiddlewareService extends DataExplorerMiddlewareService {
}
try {
+ api.dispatch(progressIndicatorActions.START(this.getId()));
const userUuid = this.services.authService.getUuid()!;
const listResults = await this.services.groupsService
.contents(userUuid, {
@@ -61,6 +63,7 @@ export class TrashPanelMiddlewareService extends DataExplorerMiddlewareService {
recursive: true,
includeTrash: true
});
+ api.dispatch(progressIndicatorActions.PERSIST_STOP(this.getId()));
const items = listResults.items.map(it => it.uuid);
@@ -71,6 +74,7 @@ export class TrashPanelMiddlewareService extends DataExplorerMiddlewareService {
api.dispatch<any>(updateFavorites(items));
api.dispatch(updateResources(listResults.items));
} catch (e) {
+ api.dispatch(progressIndicatorActions.PERSIST_STOP(this.getId()));
api.dispatch(couldNotFetchTrashContents());
}
}
diff --git a/src/views-components/data-explorer/data-explorer.tsx b/src/views-components/data-explorer/data-explorer.tsx
index 16dd599..74c3e64 100644
--- a/src/views-components/data-explorer/data-explorer.tsx
+++ b/src/views-components/data-explorer/data-explorer.tsx
@@ -21,7 +21,9 @@ interface Props {
}
const mapStateToProps = (state: RootState, { id }: Props) => {
- return getDataExplorer(state.dataExplorer, id);
+ const progress = state.progressIndicator.find(p => p.id === id);
+ const working = progress && progress.working;
+ return { ...getDataExplorer(state.dataExplorer, id), working };
};
const mapDispatchToProps = () => {
diff --git a/src/views/favorite-panel/favorite-panel.tsx b/src/views/favorite-panel/favorite-panel.tsx
index 7384956..4ba967c 100644
--- a/src/views/favorite-panel/favorite-panel.tsx
+++ b/src/views/favorite-panel/favorite-panel.tsx
@@ -164,23 +164,18 @@ export const FavoritePanel = withStyles(styles)(
connect(mapStateToProps, mapDispatchToProps)(
class extends React.Component<FavoritePanelProps> {
render() {
- return this.hasAnyFavorites()
- ? <DataExplorer
- id={FAVORITE_PANEL_ID}
- onRowClick={this.props.onItemClick}
- onRowDoubleClick={this.props.onItemDoubleClick}
- onContextMenu={this.props.onContextMenu}
- contextMenuColumn={true}
- dataTableDefaultView={<DataTableDefaultView icon={FavoriteIcon}/>} />
- : <PanelDefaultView
- icon={FavoriteIcon}
- messages={['Your favorites list is empty.']} />;
- }
-
- hasAnyFavorites = () => {
- return Object
- .keys(this.props.favorites)
- .find(uuid => this.props.favorites[uuid]);
+ return <DataExplorer
+ id={FAVORITE_PANEL_ID}
+ onRowClick={this.props.onItemClick}
+ onRowDoubleClick={this.props.onItemDoubleClick}
+ onContextMenu={this.props.onContextMenu}
+ contextMenuColumn={true}
+ dataTableDefaultView={
+ <DataTableDefaultView
+ icon={FavoriteIcon}
+ messages={['Your favorites list is empty.']}
+ />
+ } />;
}
}
)
diff --git a/src/views/project-panel/project-panel.tsx b/src/views/project-panel/project-panel.tsx
index 2c962ef..61f6766 100644
--- a/src/views/project-panel/project-panel.tsx
+++ b/src/views/project-panel/project-panel.tsx
@@ -139,27 +139,23 @@ export const ProjectPanel = withStyles(styles)(
render() {
const { classes } = this.props;
return <div className={classes.root}>
- {this.hasAnyItems()
- ? <DataExplorer
- id={PROJECT_PANEL_ID}
- onRowClick={this.handleRowClick}
- onRowDoubleClick={this.handleRowDoubleClick}
- onContextMenu={this.handleContextMenu}
- contextMenuColumn={true}
- dataTableDefaultView={<DataTableDefaultView icon={ProjectIcon}/>} />
- : <PanelDefaultView
- icon={ProjectIcon}
- messages={['Your project is empty.', 'Please create a project or create a collection and upload a data.']} />
- }
-
+ <DataExplorer
+ id={PROJECT_PANEL_ID}
+ onRowClick={this.handleRowClick}
+ onRowDoubleClick={this.handleRowDoubleClick}
+ onContextMenu={this.handleContextMenu}
+ contextMenuColumn={true}
+ dataTableDefaultView={
+ <DataTableDefaultView
+ icon={ProjectIcon}
+ messages={[
+ 'Your project is empty.',
+ 'Please create a project or create a collection and upload a data.'
+ ]}/>
+ }/>
</div>;
}
- hasAnyItems = () => {
- const resources = filterResources(this.isCurrentItemChild)(this.props.resources);
- return resources.length > 0;
- }
-
isCurrentItemChild = (resource: Resource) => {
return resource.ownerUuid === this.props.currentItemId;
}
diff --git a/src/views/trash-panel/trash-panel.tsx b/src/views/trash-panel/trash-panel.tsx
index db7d8f6..04c1335 100644
--- a/src/views/trash-panel/trash-panel.tsx
+++ b/src/views/trash-panel/trash-panel.tsx
@@ -155,23 +155,17 @@ export const TrashPanel = withStyles(styles)(
}))(
class extends React.Component<TrashPanelProps> {
render() {
- return this.hasAnyTrashedResources()
- ? <DataExplorer
- id={TRASH_PANEL_ID}
- onRowClick={this.handleRowClick}
- onRowDoubleClick={this.handleRowDoubleClick}
- onContextMenu={this.handleContextMenu}
- contextMenuColumn={false}
- dataTableDefaultView={<DataTableDefaultView icon={TrashIcon} />} />
- : <PanelDefaultView
- icon={TrashIcon}
- messages={['Your trash list is empty.']} />;
- }
-
- hasAnyTrashedResources = () => {
- // TODO: implement check if there is anything in the trash,
- // without taking pagination into the account
- return true;
+ return <DataExplorer
+ id={TRASH_PANEL_ID}
+ onRowClick={this.handleRowClick}
+ onRowDoubleClick={this.handleRowDoubleClick}
+ onContextMenu={this.handleContextMenu}
+ contextMenuColumn={false}
+ dataTableDefaultView={
+ <DataTableDefaultView
+ icon={TrashIcon}
+ messages={['Your trash list is empty.']}/>
+ } />;
}
handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list