From: Michal Klobukowski Date: Wed, 25 Jul 2018 13:20:36 +0000 (+0200) Subject: Create data-explorer-middleware X-Git-Tag: 1.2.0~19^2~17 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/eb1af55955e792abcdfd5a77d80c01d9a708ce8b Create data-explorer-middleware Feature #13887 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- 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 index 00000000..444e7400 --- /dev/null +++ b/src/store/data-explorer/data-explorer-middleware-service.ts @@ -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; + 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 index 00000000..80a6d17e --- /dev/null +++ b/src/store/data-explorer/data-explorer-middleware.ts @@ -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 = (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) + }); + }; +};