[ARVADOS-WORKBENCH2] updated: 1.1.4-445-g3eba091

Git user git at public.curoverse.com
Thu Jul 26 06:43:45 EDT 2018


Summary of changes:
 .../favorite-panel-middleware-service.ts           |  88 ++++++++++++++
 .../favorite-panel/favorite-panel-middleware.ts    | 123 +-------------------
 .../project-panel-middleware-service.ts            | 115 +++++++++++++++++++
 .../project-panel/project-panel-middleware.ts      | 127 +--------------------
 src/views-components/data-explorer/renderers.tsx   |  67 +++++++++++
 src/views/favorite-panel/favorite-panel.tsx        |  61 +---------
 src/views/project-panel/project-panel.tsx          |  61 +---------
 7 files changed, 280 insertions(+), 362 deletions(-)
 create mode 100644 src/store/favorite-panel/favorite-panel-middleware-service.ts
 create mode 100644 src/store/project-panel/project-panel-middleware-service.ts
 create mode 100644 src/views-components/data-explorer/renderers.tsx

       via  3eba091748f10f981d48f44eed14115b4fcee0ce (commit)
       via  6d0382ab90d7ac8ddcfcd291dc78c15194a25c28 (commit)
      from  e8f8e90d6c0f9f595d0a140ea6e73eb3b7fd29f5 (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 3eba091748f10f981d48f44eed14115b4fcee0ce
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Thu Jul 26 12:43:29 2018 +0200

    Create common render functions  module
    
    Feature #13887
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/views-components/data-explorer/renderers.tsx b/src/views-components/data-explorer/renderers.tsx
new file mode 100644
index 0000000..2b99f02
--- /dev/null
+++ b/src/views-components/data-explorer/renderers.tsx
@@ -0,0 +1,67 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from 'react';
+import { Grid, Typography } from '@material-ui/core';
+import { FavoriteStar } from '../favorite-star/favorite-star';
+import { ResourceKind } from '../../models/resource';
+import { ProjectIcon, CollectionIcon, ProcessIcon, DefaultIcon } from '../../components/icon/icon';
+import { formatDate, formatFileSize } from '../../common/formatters';
+import { resourceLabel } from '../../common/labels';
+
+
+export const renderName = (item: {name: string; uuid: string, kind: string}) =>
+    <Grid container alignItems="center" wrap="nowrap" spacing={16}>
+        <Grid item>
+            {renderIcon(item)}
+        </Grid>
+        <Grid item>
+            <Typography color="primary">
+                {item.name}
+            </Typography>
+        </Grid>
+        <Grid item>
+            <Typography variant="caption">
+                <FavoriteStar resourceUuid={item.uuid} />
+            </Typography>
+        </Grid>
+    </Grid>;
+
+
+export const renderIcon = (item: {kind: string}) => {
+    switch (item.kind) {
+        case ResourceKind.PROJECT:
+            return <ProjectIcon />;
+        case ResourceKind.COLLECTION:
+            return <CollectionIcon />;
+        case ResourceKind.PROCESS:
+            return <ProcessIcon />;
+        default:
+            return <DefaultIcon />;
+    }
+};
+
+export const renderDate = (date: string) => {
+    return <Typography noWrap>{formatDate(date)}</Typography>;
+};
+
+export const renderFileSize = (fileSize?: number) =>
+    <Typography noWrap>
+        {formatFileSize(fileSize)}
+    </Typography>;
+
+export const renderOwner = (owner: string) =>
+    <Typography noWrap color="primary" >
+        {owner}
+    </Typography>;
+
+export const renderType = (type: string) =>
+    <Typography noWrap>
+        {resourceLabel(type)}
+    </Typography>;
+
+export const renderStatus = (item: {status?: string}) =>
+    <Typography noWrap align="center" >
+        {item.status || "-"}
+    </Typography>;
\ No newline at end of file
diff --git a/src/views/favorite-panel/favorite-panel.tsx b/src/views/favorite-panel/favorite-panel.tsx
index 36a3410..25a8251 100644
--- a/src/views/favorite-panel/favorite-panel.tsx
+++ b/src/views/favorite-panel/favorite-panel.tsx
@@ -4,8 +4,7 @@
 
 import * as React from 'react';
 import { FavoritePanelItem } from './favorite-panel-item';
-import { Grid, Typography, Button, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
-import { formatDate, formatFileSize } from '../../common/formatters';
+import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
 import { DataExplorer } from "../../views-components/data-explorer/data-explorer";
 import { DispatchProp, connect } from 'react-redux';
 import { DataColumns } from '../../components/data-table/data-table';
@@ -16,9 +15,8 @@ import { ContainerRequestState } from '../../models/container-request';
 import { SortDirection } from '../../components/data-table/data-column';
 import { ResourceKind } from '../../models/resource';
 import { resourceLabel } from '../../common/labels';
-import { ProjectIcon, CollectionIcon, ProcessIcon, DefaultIcon } from '../../components/icon/icon';
 import { ArvadosTheme } from '../../common/custom-theme';
-import { FavoriteStar } from "../../views-components/favorite-star/favorite-star";
+import { renderName, renderStatus, renderType, renderOwner, renderFileSize, renderDate } from '../../views-components/data-explorer/renderers';
 
 type CssRules = "toolbar" | "button";
 
@@ -32,61 +30,6 @@ const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
     },
 });
 
-const renderName = (item: FavoritePanelItem) =>
-    <Grid container alignItems="center" wrap="nowrap" spacing={16}>
-        <Grid item>
-            {renderIcon(item)}
-        </Grid>
-        <Grid item>
-            <Typography color="primary">
-                {item.name}
-            </Typography>
-        </Grid>
-        <Grid item>
-            <Typography variant="caption">
-                <FavoriteStar resourceUuid={item.uuid} />
-            </Typography>
-        </Grid>
-    </Grid>;
-
-
-const renderIcon = (item: FavoritePanelItem) => {
-    switch (item.kind) {
-        case ResourceKind.PROJECT:
-            return <ProjectIcon />;
-        case ResourceKind.COLLECTION:
-            return <CollectionIcon />;
-        case ResourceKind.PROCESS:
-            return <ProcessIcon />;
-        default:
-            return <DefaultIcon />;
-    }
-};
-
-const renderDate = (date: string) => {
-    return <Typography noWrap>{formatDate(date)}</Typography>;
-};
-
-const renderFileSize = (fileSize?: number) =>
-    <Typography noWrap>
-        {formatFileSize(fileSize)}
-    </Typography>;
-
-const renderOwner = (owner: string) =>
-    <Typography noWrap color="primary" >
-        {owner}
-    </Typography>;
-
-const renderType = (type: string) =>
-    <Typography noWrap>
-        {resourceLabel(type)}
-    </Typography>;
-
-const renderStatus = (item: FavoritePanelItem) =>
-    <Typography noWrap align="center" >
-        {item.status || "-"}
-    </Typography>;
-
 export enum FavoritePanelColumnNames {
     NAME = "Name",
     STATUS = "Status",
diff --git a/src/views/project-panel/project-panel.tsx b/src/views/project-panel/project-panel.tsx
index 17b0fd7..c7138c3 100644
--- a/src/views/project-panel/project-panel.tsx
+++ b/src/views/project-panel/project-panel.tsx
@@ -4,8 +4,7 @@
 
 import * as React from 'react';
 import { ProjectPanelItem } from './project-panel-item';
-import { Grid, Typography, Button, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
-import { formatDate, formatFileSize } from '../../common/formatters';
+import { Button, StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
 import { DataExplorer } from "../../views-components/data-explorer/data-explorer";
 import { DispatchProp, connect } from 'react-redux';
 import { DataColumns } from '../../components/data-table/data-table';
@@ -16,9 +15,8 @@ import { ContainerRequestState } from '../../models/container-request';
 import { SortDirection } from '../../components/data-table/data-column';
 import { ResourceKind } from '../../models/resource';
 import { resourceLabel } from '../../common/labels';
-import { ProjectIcon, CollectionIcon, ProcessIcon, DefaultIcon, FavoriteIcon } from '../../components/icon/icon';
 import { ArvadosTheme } from '../../common/custom-theme';
-import { FavoriteStar } from '../../views-components/favorite-star/favorite-star';
+import { renderName, renderStatus, renderType, renderOwner, renderFileSize, renderDate } from '../../views-components/data-explorer/renderers';
 
 type CssRules = "toolbar" | "button";
 
@@ -32,61 +30,6 @@ const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
     },
 });
 
-const renderName = (item: ProjectPanelItem) =>
-    <Grid container alignItems="center" wrap="nowrap" spacing={16}>
-        <Grid item>
-            {renderIcon(item)}
-        </Grid>
-        <Grid item>
-            <Typography color="primary">
-                {item.name}
-            </Typography>
-        </Grid>
-        <Grid item>
-            <Typography variant="caption">
-                <FavoriteStar resourceUuid={item.uuid} />
-            </Typography>
-        </Grid>
-    </Grid>;
-
-
-const renderIcon = (item: ProjectPanelItem) => {
-    switch (item.kind) {
-        case ResourceKind.PROJECT:
-            return <ProjectIcon />;
-        case ResourceKind.COLLECTION:
-            return <CollectionIcon />;
-        case ResourceKind.PROCESS:
-            return <ProcessIcon />;
-        default:
-            return <DefaultIcon />;
-    }
-};
-
-const renderDate = (date: string) => {
-    return <Typography noWrap>{formatDate(date)}</Typography>;
-};
-
-const renderFileSize = (fileSize?: number) =>
-    <Typography noWrap>
-        {formatFileSize(fileSize)}
-    </Typography>;
-
-const renderOwner = (owner: string) =>
-    <Typography noWrap color="primary" >
-        {owner}
-    </Typography>;
-
-const renderType = (type: string) =>
-    <Typography noWrap>
-        {resourceLabel(type)}
-    </Typography>;
-
-const renderStatus = (item: ProjectPanelItem) =>
-    <Typography noWrap align="center" >
-        {item.status || "-"}
-    </Typography>;
-
 export enum ProjectPanelColumnNames {
     NAME = "Name",
     STATUS = "Status",

commit 6d0382ab90d7ac8ddcfcd291dc78c15194a25c28
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Thu Jul 26 12:34:09 2018 +0200

    Update favorite-panel and project panel implementation
    
    Feature #13887
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/store/favorite-panel/favorite-panel-middleware-service.ts b/src/store/favorite-panel/favorite-panel-middleware-service.ts
new file mode 100644
index 0000000..3826c4b
--- /dev/null
+++ b/src/store/favorite-panel/favorite-panel-middleware-service.ts
@@ -0,0 +1,88 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { DataExplorerMiddlewareService } from "../data-explorer/data-explorer-middleware-service";
+import { FAVORITE_PANEL_ID, columns, FavoritePanelFilter, FavoritePanelColumnNames } from "../../views/favorite-panel/favorite-panel";
+import { getDataExplorer } from "../data-explorer/data-explorer-reducer";
+import { RootState } from "../store";
+import { DataColumns } from "../../components/data-table/data-table";
+import { FavoritePanelItem, resourceToDataItem } from "../../views/favorite-panel/favorite-panel-item";
+import { FavoriteOrderBuilder } from "../../services/favorite-service/favorite-order-builder";
+import { favoriteService } from "../../services/services";
+import { SortDirection } from "../../components/data-table/data-column";
+import { FilterBuilder } from "../../common/api/filter-builder";
+import { LinkResource } from "../../models/link";
+import { dataExplorerActions } from "../data-explorer/data-explorer-action";
+import { checkPresenceInFavorites } from "../favorites/favorites-actions";
+
+export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareService {
+
+    private static instance: FavoritePanelMiddlewareService;
+
+    static getInstance() {
+        return FavoritePanelMiddlewareService.instance
+            ? FavoritePanelMiddlewareService.instance
+            : new FavoritePanelMiddlewareService();
+    }
+
+    private constructor() {
+        super();
+    }
+
+    get Id() {
+        return FAVORITE_PANEL_ID;
+    }
+
+    get Columns() {
+        return columns;
+    }
+
+    requestItems() {
+        const state = this.api.getState() as RootState;
+        const dataExplorer = getDataExplorer(state.dataExplorer, FAVORITE_PANEL_ID);
+        const columns = dataExplorer.columns as DataColumns<FavoritePanelItem, FavoritePanelFilter>;
+        const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
+        const typeFilters = getColumnFilters(columns, FavoritePanelColumnNames.TYPE);
+        const order = FavoriteOrderBuilder.create();
+        if (typeFilters.length > 0) {
+            favoriteService
+                .list(state.projects.currentItemId, {
+                    limit: dataExplorer.rowsPerPage,
+                    offset: dataExplorer.page * dataExplorer.rowsPerPage,
+                    order: sortColumn!.name === FavoritePanelColumnNames.NAME
+                        ? sortColumn!.sortDirection === SortDirection.ASC
+                            ? order.addDesc("name")
+                            : order.addAsc("name")
+                        : order,
+                    filters: FilterBuilder
+                        .create<LinkResource>()
+                        .addIsA("headUuid", typeFilters.map(filter => filter.type))
+                        .addILike("name", dataExplorer.searchValue)
+                })
+                .then(response => {
+                    this.api.dispatch(dataExplorerActions.SET_ITEMS({
+                        id: FAVORITE_PANEL_ID,
+                        items: response.items.map(resourceToDataItem),
+                        itemsAvailable: response.itemsAvailable,
+                        page: Math.floor(response.offset / response.limit),
+                        rowsPerPage: response.limit
+                    }));
+                    this.api.dispatch<any>(checkPresenceInFavorites(response.items.map(item => item.uuid)));
+                });
+        } else {
+            this.api.dispatch(dataExplorerActions.SET_ITEMS({
+                id: FAVORITE_PANEL_ID,
+                items: [],
+                itemsAvailable: 0,
+                page: 0,
+                rowsPerPage: dataExplorer.rowsPerPage
+            }));
+        }
+    }
+}
+
+const getColumnFilters = (columns: DataColumns<FavoritePanelItem, FavoritePanelFilter>, columnName: string) => {
+    const column = columns.find(c => c.name === columnName);
+    return column && column.filters ? column.filters.filter(f => f.selected) : [];
+};
diff --git a/src/store/favorite-panel/favorite-panel-middleware.ts b/src/store/favorite-panel/favorite-panel-middleware.ts
index 548a117..f54cc72 100644
--- a/src/store/favorite-panel/favorite-panel-middleware.ts
+++ b/src/store/favorite-panel/favorite-panel-middleware.ts
@@ -2,124 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { Middleware } from "redux";
-import { dataExplorerActions } from "../data-explorer/data-explorer-action";
-import { favoriteService } from "../../services/services";
-import { RootState } from "../store";
-import { getDataExplorer } from "../data-explorer/data-explorer-reducer";
-import { FilterBuilder } from "../../common/api/filter-builder";
-import { DataColumns } from "../../components/data-table/data-table";
-import {
-    columns,
-    FAVORITE_PANEL_ID,
-    FavoritePanelColumnNames,
-    FavoritePanelFilter
-} from "../../views/favorite-panel/favorite-panel";
-import { FavoritePanelItem, resourceToDataItem } from "../../views/favorite-panel/favorite-panel-item";
-import { LinkResource } from "../../models/link";
-import { checkPresenceInFavorites } from "../favorites/favorites-actions";
-import { OrderBuilder } from "../../common/api/order-builder";
-import { SortDirection } from "../../components/data-table/data-column";
-import { GroupContentsResource, GroupContentsResourcePrefix } from "../../services/groups-service/groups-service";
-import { FavoriteOrderBuilder } from "../../services/favorite-service/favorite-order-builder";
-
-export const favoritePanelMiddleware: Middleware = store => next => {
-    next(dataExplorerActions.SET_COLUMNS({ id: FAVORITE_PANEL_ID, columns }));
-
-    return action => {
-
-        const handlePanelAction = <T extends { id: string }>(handler: (data: T) => void) =>
-            (data: T) => {
-                next(action);
-                if (data.id === FAVORITE_PANEL_ID) {
-                    handler(data);
-                }
-            };
-
-        dataExplorerActions.match(action, {
-            SET_PAGE: handlePanelAction(() => {
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }));
-            }),
-            SET_ROWS_PER_PAGE: handlePanelAction(() => {
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }));
-            }),
-            SET_FILTERS: handlePanelAction(() => {
-                store.dispatch(dataExplorerActions.RESET_PAGINATION({ id: FAVORITE_PANEL_ID }));
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }));
-            }),
-            TOGGLE_SORT: handlePanelAction(() => {
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }));
-            }),
-            SET_SEARCH_VALUE: handlePanelAction(() => {
-                store.dispatch(dataExplorerActions.RESET_PAGINATION({ id: FAVORITE_PANEL_ID }));
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }));
-            }),
-            REQUEST_ITEMS: handlePanelAction(() => {
-                const state = store.getState() as RootState;
-                const dataExplorer = getDataExplorer(state.dataExplorer, FAVORITE_PANEL_ID);
-                const columns = dataExplorer.columns as DataColumns<FavoritePanelItem, FavoritePanelFilter>;
-                const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
-                const typeFilters = getColumnFilters(columns, FavoritePanelColumnNames.TYPE);
-                const order = FavoriteOrderBuilder.create();
-                if (typeFilters.length > 0) {
-                    favoriteService
-                        .list(state.projects.currentItemId, {
-                            limit: dataExplorer.rowsPerPage,
-                            offset: dataExplorer.page * dataExplorer.rowsPerPage,
-                            order: sortColumn!.name === FavoritePanelColumnNames.NAME
-                                ? sortColumn!.sortDirection === SortDirection.ASC
-                                    ? order.addDesc("name")
-                                    : order.addAsc("name")
-                                : order,
-                            filters: FilterBuilder
-                                .create<LinkResource>()
-                                .addIsA("headUuid", typeFilters.map(filter => filter.type))
-                                .addILike("name", dataExplorer.searchValue)
-                        })
-                        .then(response => {
-                            store.dispatch(dataExplorerActions.SET_ITEMS({
-                                id: FAVORITE_PANEL_ID,
-                                items: response.items.map(resourceToDataItem),
-                                itemsAvailable: response.itemsAvailable,
-                                page: Math.floor(response.offset / response.limit),
-                                rowsPerPage: response.limit
-                            }));
-                            store.dispatch<any>(checkPresenceInFavorites(response.items.map(item => item.uuid)));
-                        });
-                } else {
-                    store.dispatch(dataExplorerActions.SET_ITEMS({
-                        id: FAVORITE_PANEL_ID,
-                        items: [],
-                        itemsAvailable: 0,
-                        page: 0,
-                        rowsPerPage: dataExplorer.rowsPerPage
-                    }));
-                }
-            }),
-            default: () => next(action)
-        });
-    };
-};
-
-const getOrder = (direction: SortDirection) => {
-    const order = OrderBuilder.create<LinkResource>();
-    const addRule = (builder: OrderBuilder<GroupContentsResource | LinkResource>, direction: SortDirection) =>
-        direction === SortDirection.ASC
-            ? builder.addAsc("name")
-            : builder.addDesc("name");
-
-    return [
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)
-    ].reduce((acc, b) =>
-        acc.concat(addRule(b, direction)), addRule(OrderBuilder.create(), direction));
-};
-
-const getColumnFilters = (columns: DataColumns<FavoritePanelItem, FavoritePanelFilter>, columnName: string) => {
-    const column = columns.find(c => c.name === columnName);
-    return column && column.filters ? column.filters.filter(f => f.selected) : [];
-};
-
-
+import { dataExplorerMiddleware } from "../data-explorer/data-explorer-middleware";
+import { FavoritePanelMiddlewareService } from "./favorite-panel-middleware-service";
 
+export const favoritePanelMiddleware = dataExplorerMiddleware(FavoritePanelMiddlewareService.getInstance());
\ No newline at end of file
diff --git a/src/store/project-panel/project-panel-middleware-service.ts b/src/store/project-panel/project-panel-middleware-service.ts
new file mode 100644
index 0000000..03ccbfd
--- /dev/null
+++ b/src/store/project-panel/project-panel-middleware-service.ts
@@ -0,0 +1,115 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { DataExplorerMiddlewareService } from "../data-explorer/data-explorer-middleware-service";
+import { PROJECT_PANEL_ID, columns, ProjectPanelColumnNames, ProjectPanelFilter } from "../../views/project-panel/project-panel";
+import { getDataExplorer } from "../data-explorer/data-explorer-reducer";
+import { RootState } from "../store";
+import { DataColumns } from "../../components/data-table/data-table";
+import { groupsService } from "../../services/services";
+import { ProjectPanelItem, resourceToDataItem } from "../../views/project-panel/project-panel-item";
+import { SortDirection } from "../../components/data-table/data-column";
+import { OrderBuilder } from "../../common/api/order-builder";
+import { FilterBuilder } from "../../common/api/filter-builder";
+import { ProcessResource } from "../../models/process";
+import { GroupContentsResourcePrefix, GroupContentsResource } from "../../services/groups-service/groups-service";
+import { dataExplorerActions } from "../data-explorer/data-explorer-action";
+import { checkPresenceInFavorites } from "../favorites/favorites-actions";
+
+export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService {
+
+    private static instance: ProjectPanelMiddlewareService;
+
+    static getInstance() {
+        return ProjectPanelMiddlewareService.instance
+            ? ProjectPanelMiddlewareService.instance
+            : new ProjectPanelMiddlewareService();
+    }
+
+    private constructor() {
+        super();
+    }
+
+    get Id() {
+        return PROJECT_PANEL_ID;
+    }
+
+    get Columns() {
+        return columns;
+    }
+
+    requestItems() {
+        const state = this.api.getState() as RootState;
+        const dataExplorer = getDataExplorer(state.dataExplorer, PROJECT_PANEL_ID);
+        const columns = dataExplorer.columns as DataColumns<ProjectPanelItem, ProjectPanelFilter>;
+        const typeFilters = getColumnFilters(columns, ProjectPanelColumnNames.TYPE);
+        const statusFilters = getColumnFilters(columns, ProjectPanelColumnNames.STATUS);
+        const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
+        const sortDirection = sortColumn && sortColumn.sortDirection === SortDirection.ASC ? SortDirection.ASC : SortDirection.DESC;
+        if (typeFilters.length > 0) {
+            groupsService
+                .contents(state.projects.currentItemId, {
+                    limit: dataExplorer.rowsPerPage,
+                    offset: dataExplorer.page * dataExplorer.rowsPerPage,
+                    order: sortColumn
+                        ? sortColumn.name === ProjectPanelColumnNames.NAME
+                            ? getOrder("name", sortDirection)
+                            : getOrder("createdAt", sortDirection)
+                        : OrderBuilder.create(),
+                    filters: FilterBuilder
+                        .create()
+                        .concat(FilterBuilder
+                            .create()
+                            .addIsA("uuid", typeFilters.map(f => f.type)))
+                        .concat(FilterBuilder
+                            .create<ProcessResource>(GroupContentsResourcePrefix.PROCESS)
+                            .addIn("state", statusFilters.map(f => f.type)))
+                        .concat(getSearchFilter(dataExplorer.searchValue))
+                })
+                .then(response => {
+                    this.api.dispatch(dataExplorerActions.SET_ITEMS({
+                        id: PROJECT_PANEL_ID,
+                        items: response.items.map(resourceToDataItem),
+                        itemsAvailable: response.itemsAvailable,
+                        page: Math.floor(response.offset / response.limit),
+                        rowsPerPage: response.limit
+                    }));
+                    this.api.dispatch<any>(checkPresenceInFavorites(response.items.map(item => item.uuid)));
+                });
+        } else {
+            this.api.dispatch(dataExplorerActions.SET_ITEMS({
+                id: PROJECT_PANEL_ID,
+                items: [],
+                itemsAvailable: 0,
+                page: 0,
+                rowsPerPage: dataExplorer.rowsPerPage
+            }));
+        }
+    }
+}
+
+const getColumnFilters = (columns: DataColumns<ProjectPanelItem, ProjectPanelFilter>, columnName: string) => {
+    const column = columns.find(c => c.name === columnName);
+    return column && column.filters ? column.filters.filter(f => f.selected) : [];
+};
+
+const getOrder = (attribute: "name" | "createdAt", direction: SortDirection) =>
+    [
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)
+    ].reduce((acc, b) =>
+        acc.concat(direction === SortDirection.ASC
+            ? b.addAsc(attribute)
+            : b.addDesc(attribute)), OrderBuilder.create());
+
+const getSearchFilter = (searchValue: string) =>
+    searchValue
+        ? [
+            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
+            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
+            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)]
+            .reduce((acc, b) =>
+                acc.concat(b.addILike("name", searchValue)), FilterBuilder.create())
+        : FilterBuilder.create();
\ No newline at end of file
diff --git a/src/store/project-panel/project-panel-middleware.ts b/src/store/project-panel/project-panel-middleware.ts
index b7ab03c..4417d15 100644
--- a/src/store/project-panel/project-panel-middleware.ts
+++ b/src/store/project-panel/project-panel-middleware.ts
@@ -2,128 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { Middleware } from "redux";
-import { dataExplorerActions } from "../data-explorer/data-explorer-action";
-import { PROJECT_PANEL_ID, columns, ProjectPanelFilter, ProjectPanelColumnNames } from "../../views/project-panel/project-panel";
-import { groupsService } from "../../services/services";
-import { RootState } from "../store";
-import { getDataExplorer } from "../data-explorer/data-explorer-reducer";
-import { resourceToDataItem, ProjectPanelItem } from "../../views/project-panel/project-panel-item";
-import { FilterBuilder } from "../../common/api/filter-builder";
-import { DataColumns } from "../../components/data-table/data-table";
-import { ProcessResource } from "../../models/process";
-import { OrderBuilder } from "../../common/api/order-builder";
-import { GroupContentsResource, GroupContentsResourcePrefix } from "../../services/groups-service/groups-service";
-import { SortDirection } from "../../components/data-table/data-column";
-import { checkPresenceInFavorites } from "../favorites/favorites-actions";
-
-export const projectPanelMiddleware: Middleware = store => next => {
-    next(dataExplorerActions.SET_COLUMNS({ id: PROJECT_PANEL_ID, columns }));
-
-    return action => {
-
-        const handleProjectPanelAction = <T extends { id: string }>(handler: (data: T) => void) =>
-            (data: T) => {
-                next(action);
-                if (data.id === PROJECT_PANEL_ID) {
-                    handler(data);
-                }
-            };
-
-        dataExplorerActions.match(action, {
-            SET_PAGE: handleProjectPanelAction(() => {
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID }));
-            }),
-            SET_ROWS_PER_PAGE: handleProjectPanelAction(() => {
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID }));
-            }),
-            SET_FILTERS: handleProjectPanelAction(() => {
-                store.dispatch(dataExplorerActions.RESET_PAGINATION({ id: PROJECT_PANEL_ID }));
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID }));
-            }),
-            TOGGLE_SORT: handleProjectPanelAction(() => {
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID }));
-            }),
-            SET_SEARCH_VALUE: handleProjectPanelAction(() => {
-                store.dispatch(dataExplorerActions.RESET_PAGINATION({ id: PROJECT_PANEL_ID }));
-                store.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID }));
-            }),
-            REQUEST_ITEMS: handleProjectPanelAction(() => {
-                const state = store.getState() as RootState;
-                const dataExplorer = getDataExplorer(state.dataExplorer, PROJECT_PANEL_ID);
-                const columns = dataExplorer.columns as DataColumns<ProjectPanelItem, ProjectPanelFilter>;
-                const typeFilters = getColumnFilters(columns, ProjectPanelColumnNames.TYPE);
-                const statusFilters = getColumnFilters(columns, ProjectPanelColumnNames.STATUS);
-                const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
-                const sortDirection = sortColumn && sortColumn.sortDirection === SortDirection.ASC ? SortDirection.ASC : SortDirection.DESC;
-                if (typeFilters.length > 0) {
-                    groupsService
-                        .contents(state.projects.currentItemId, {
-                            limit: dataExplorer.rowsPerPage,
-                            offset: dataExplorer.page * dataExplorer.rowsPerPage,
-                            order: sortColumn
-                                ? sortColumn.name === ProjectPanelColumnNames.NAME
-                                    ? getOrder("name", sortDirection)
-                                    : getOrder("createdAt", sortDirection)
-                                : OrderBuilder.create(),
-                            filters: FilterBuilder
-                                .create()
-                                .concat(FilterBuilder
-                                    .create()
-                                    .addIsA("uuid", typeFilters.map(f => f.type)))
-                                .concat(FilterBuilder
-                                    .create<ProcessResource>(GroupContentsResourcePrefix.PROCESS)
-                                    .addIn("state", statusFilters.map(f => f.type)))
-                                .concat(getSearchFilter(dataExplorer.searchValue))
-                        })
-                        .then(response => {
-                            store.dispatch(dataExplorerActions.SET_ITEMS({
-                                id: PROJECT_PANEL_ID,
-                                items: response.items.map(resourceToDataItem),
-                                itemsAvailable: response.itemsAvailable,
-                                page: Math.floor(response.offset / response.limit),
-                                rowsPerPage: response.limit
-                            }));
-                            store.dispatch<any>(checkPresenceInFavorites(response.items.map(item => item.uuid)));
-                        });
-                } else {
-                    store.dispatch(dataExplorerActions.SET_ITEMS({
-                        id: PROJECT_PANEL_ID,
-                        items: [],
-                        itemsAvailable: 0,
-                        page: 0,
-                        rowsPerPage: dataExplorer.rowsPerPage
-                    }));
-                }
-            }),
-            default: () => next(action)
-        });
-    };
-};
-
-const getColumnFilters = (columns: DataColumns<ProjectPanelItem, ProjectPanelFilter>, columnName: string) => {
-    const column = columns.find(c => c.name === columnName);
-    return column && column.filters ? column.filters.filter(f => f.selected) : [];
-};
-
-const getOrder = (attribute: "name" | "createdAt", direction: SortDirection) =>
-    [
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)
-    ].reduce((acc, b) =>
-        acc.concat(direction === SortDirection.ASC
-            ? b.addAsc(attribute)
-            : b.addDesc(attribute)), OrderBuilder.create());
-
-const getSearchFilter = (searchValue: string) =>
-    searchValue
-        ? [
-            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
-            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
-            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)]
-            .reduce((acc, b) =>
-                acc.concat(b.addILike("name", searchValue)), FilterBuilder.create())
-        : FilterBuilder.create();
-
+import { dataExplorerMiddleware } from "../data-explorer/data-explorer-middleware";
+import { ProjectPanelMiddlewareService } from "./project-panel-middleware-service";
 
+export const projectPanelMiddleware = dataExplorerMiddleware(ProjectPanelMiddlewareService.getInstance());

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list