Create data-explorer-middleware
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Wed, 25 Jul 2018 13:20:36 +0000 (15:20 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Wed, 25 Jul 2018 13:20:36 +0000 (15:20 +0200)
Feature #13887

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/store/data-explorer/data-explorer-middleware-service.ts [new file with mode: 0644]
src/store/data-explorer/data-explorer-middleware.ts [new file with mode: 0644]

diff --git a/src/store/data-explorer/data-explorer-middleware-service.ts b/src/store/data-explorer/data-explorer-middleware-service.ts
new file mode 100644 (file)
index 0000000..444e740
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { getDataExplorer } from "./data-explorer-reducer";
+import { MiddlewareAPI } from "../../../node_modules/redux";
+import { DataColumns } from "../../components/data-table/data-table";
+
+export abstract class DataExplorerMiddlewareService {
+
+    abstract get Id(): string;
+    abstract get Columns(): DataColumns<any>;
+    abstract requestItems (api: MiddlewareAPI): void;
+    
+    protected api: MiddlewareAPI;
+    set Api(value: MiddlewareAPI) {
+        this.api = value;
+    }
+    get DataExplorer () {
+        return getDataExplorer(this.api.getState(), this.Id);
+    }
+}
\ No newline at end of file
diff --git a/src/store/data-explorer/data-explorer-middleware.ts b/src/store/data-explorer/data-explorer-middleware.ts
new file mode 100644 (file)
index 0000000..80a6d17
--- /dev/null
@@ -0,0 +1,45 @@
+
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { Middleware } from "../../../node_modules/redux";
+import { dataExplorerActions } from "./data-explorer-action";
+import { DataExplorerMiddlewareService } from "./data-explorer-middleware-service";
+
+export const dataExplorerMiddleware = (service: DataExplorerMiddlewareService): Middleware => api => next => {
+    service.Api = api;
+    next(dataExplorerActions.SET_COLUMNS({ id: service.Id, columns: service.Columns }));
+    return action => {
+        const handleAction = <T extends { id: string }>(handler: (data: T) => void) =>
+            (data: T) => {
+                next(action);
+                if (data.id === service.Id) {
+                    handler(data);
+                }
+            };
+        dataExplorerActions.match(action, {
+            SET_PAGE: handleAction(() => {
+                api.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: service.Id }));
+            }),
+            SET_ROWS_PER_PAGE: handleAction(() => {
+                api.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: service.Id }));
+            }),
+            SET_FILTERS: handleAction(() => {
+                api.dispatch(dataExplorerActions.RESET_PAGINATION({ id: service.Id }));
+                api.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: service.Id }));
+            }),
+            TOGGLE_SORT: handleAction(() => {
+                api.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: service.Id }));
+            }),
+            SET_SEARCH_VALUE: handleAction(() => {
+                api.dispatch(dataExplorerActions.RESET_PAGINATION({ id: service.Id }));
+                api.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: service.Id }));
+            }),
+            REQUEST_ITEMS: handleAction(() => {
+                service.requestItems(api);
+            }),
+            default: () => next(action)
+        });
+    };
+};