1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { Dispatch, MiddlewareAPI } from 'redux';
6 import { RootState } from 'store/store';
7 import { ServiceRepository } from 'services/services';
8 import { Middleware } from "redux";
9 import { getNode, getNodeDescendantsIds, TreeNodeStatus } from 'models/tree';
10 import { getTreePicker } from './tree-picker';
12 treePickerSearchActions, loadProject, loadFavoritesProject, loadPublicFavoritesProject,
13 SHARED_PROJECT_ID, FAVORITES_PROJECT_ID, PUBLIC_FAVORITES_PROJECT_ID, SEARCH_PROJECT_ID
14 } from "./tree-picker-actions";
15 import { LinkResource } from "models/link";
16 import { UserResource } from "models/user";
17 import { GroupContentsResource } from 'services/groups-service/groups-service';
18 import { CollectionDirectory, CollectionFile } from 'models/collection-file';
20 export interface ProjectsTreePickerRootItem {
25 export type ProjectsTreePickerItem = ProjectsTreePickerRootItem | GroupContentsResource | CollectionDirectory | CollectionFile | LinkResource | UserResource;
27 export const treePickerSearchMiddleware: Middleware = store => next => action => {
28 let isSearchAction = false;
29 let searchChanged = false;
31 treePickerSearchActions.match(action, {
32 SET_TREE_PICKER_PROJECT_SEARCH: ({ pickerId, projectSearchValue }) => {
33 isSearchAction = true;
34 searchChanged = store.getState().treePickerSearch.projectSearchValues[pickerId] !== projectSearchValue;
37 SET_TREE_PICKER_COLLECTION_FILTER: ({ pickerId, collectionFilterValue }) => {
38 isSearchAction = true;
39 searchChanged = store.getState().treePickerSearch.collectionFilterValues[pickerId] !== collectionFilterValue;
42 REFRESH_TREE_PICKER: refreshPickers(store),
46 if (isSearchAction && !searchChanged) {
50 // pass it on to the reducer
51 const r = next(action);
53 treePickerSearchActions.match(action, {
54 SET_TREE_PICKER_PROJECT_SEARCH: ({ pickerId }) =>
55 store.dispatch<any>((dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
56 const picker = getTreePicker<ProjectsTreePickerItem>(pickerId)(getState().treePicker);
58 const loadParams = getState().treePickerSearch.loadProjectParams[pickerId];
59 dispatch<any>(loadProject({
61 id: SEARCH_PROJECT_ID,
67 SET_TREE_PICKER_COLLECTION_FILTER: refreshPickers(store),
74 const refreshPickers = (store: MiddlewareAPI) => ({ pickerId }) =>
75 store.dispatch<any>((dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
76 const picker = getTreePicker<ProjectsTreePickerItem>(pickerId)(getState().treePicker);
78 const loadParams = getState().treePickerSearch.loadProjectParams[pickerId];
79 getNodeDescendantsIds('')(picker)
81 const node = getNode(id)(picker);
82 if (node && node.status !== TreeNodeStatus.INITIAL) {
83 if (node.id.substring(6, 11) === 'tpzed' || node.id.substring(6, 11) === 'j7d0g') {
84 dispatch<any>(loadProject({
90 if (node.id === SHARED_PROJECT_ID) {
91 dispatch<any>(loadProject({
98 if (node.id === SEARCH_PROJECT_ID) {
99 dispatch<any>(loadProject({
105 if (node.id === FAVORITES_PROJECT_ID) {
106 dispatch<any>(loadFavoritesProject({
111 if (node.id === PUBLIC_FAVORITES_PROJECT_ID) {
112 dispatch<any>(loadPublicFavoritesProject({