Fix and make use of DataExplorer getter
[arvados-workbench2.git] / src / store / favorite-panel / favorite-panel-middleware-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { DataExplorerMiddlewareService } from "../data-explorer/data-explorer-middleware-service";
6 import { columns, FavoritePanelFilter, FavoritePanelColumnNames } from "../../views/favorite-panel/favorite-panel";
7 import { getDataExplorer } from "../data-explorer/data-explorer-reducer";
8 import { RootState } from "../store";
9 import { DataColumns } from "../../components/data-table/data-table";
10 import { FavoritePanelItem, resourceToDataItem } from "../../views/favorite-panel/favorite-panel-item";
11 import { FavoriteOrderBuilder } from "../../services/favorite-service/favorite-order-builder";
12 import { favoriteService } from "../../services/services";
13 import { SortDirection } from "../../components/data-table/data-column";
14 import { FilterBuilder } from "../../common/api/filter-builder";
15 import { LinkResource } from "../../models/link";
16 import { checkPresenceInFavorites } from "../favorites/favorites-actions";
17 import { favoritePanelActions } from "./favorite-panel-action";
18
19 export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareService {
20
21     private static instance: FavoritePanelMiddlewareService;
22
23     static getInstance() {
24         return FavoritePanelMiddlewareService.instance
25             ? FavoritePanelMiddlewareService.instance
26             : new FavoritePanelMiddlewareService();
27     }
28
29     private constructor() {
30         super();
31     }
32
33     get Id() {
34         return "favoritePanel";
35     }
36
37     get Columns() {
38         return columns;
39     }
40
41     requestItems() {
42         const state = this.api.getState() as RootState;
43         const dataExplorer = this.DataExplorer;
44         const columns = dataExplorer.columns as DataColumns<FavoritePanelItem, FavoritePanelFilter>;
45         const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
46         const typeFilters = getColumnFilters(columns, FavoritePanelColumnNames.TYPE);
47         const order = FavoriteOrderBuilder.create();
48         if (typeFilters.length > 0) {
49             favoriteService
50                 .list(state.projects.currentItemId, {
51                     limit: dataExplorer.rowsPerPage,
52                     offset: dataExplorer.page * dataExplorer.rowsPerPage,
53                     order: sortColumn!.name === FavoritePanelColumnNames.NAME
54                         ? sortColumn!.sortDirection === SortDirection.ASC
55                             ? order.addDesc("name")
56                             : order.addAsc("name")
57                         : order,
58                     filters: FilterBuilder
59                         .create<LinkResource>()
60                         .addIsA("headUuid", typeFilters.map(filter => filter.type))
61                         .addILike("name", dataExplorer.searchValue)
62                 })
63                 .then(response => {
64                     this.api.dispatch(favoritePanelActions.SET_ITEMS({
65                         items: response.items.map(resourceToDataItem),
66                         itemsAvailable: response.itemsAvailable,
67                         page: Math.floor(response.offset / response.limit),
68                         rowsPerPage: response.limit
69                     }));
70                     this.api.dispatch<any>(checkPresenceInFavorites(response.items.map(item => item.uuid)));
71                 });
72         } else {
73             this.api.dispatch(favoritePanelActions.SET_ITEMS({
74                 items: [],
75                 itemsAvailable: 0,
76                 page: 0,
77                 rowsPerPage: dataExplorer.rowsPerPage
78             }));
79         }
80     }
81 }
82
83 const getColumnFilters = (columns: DataColumns<FavoritePanelItem, FavoritePanelFilter>, columnName: string) => {
84     const column = columns.find(c => c.name === columnName);
85     return column && column.filters ? column.filters.filter(f => f.selected) : [];
86 };