1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { Project } from "../../models/project";
6 import actions, { ProjectAction } from "./project-action";
7 import { TreeItem, TreeItemStatus } from "../../components/tree/tree";
8 import * as _ from "lodash";
10 export type ProjectState = {
11 items: Array<TreeItem<Project>>,
15 export function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
17 for (const t of tree) {
18 item = t.id === itemId
20 : findTreeItem(t.items ? t.items : [], itemId);
28 export function getActiveTreeItem<T>(tree: Array<TreeItem<T>>): TreeItem<T> | undefined {
30 for (const t of tree) {
33 : getActiveTreeItem(t.items ? t.items : []);
41 export function getTreePath<T>(tree: Array<TreeItem<T>>, itemId: string): Array<TreeItem<T>> {
42 for (const item of tree){
43 if(item.id === itemId){
46 const branch = getTreePath(item.items || [], itemId);
47 if(branch.length > 0){
48 return [item, ...branch];
55 function resetTreeActivity<T>(tree: Array<TreeItem<T>>) {
56 for (const t of tree) {
58 resetTreeActivity(t.items ? t.items : []);
62 function updateProjectTree(tree: Array<TreeItem<Project>>, projects: Project[], parentItemId?: string): Array<TreeItem<Project>> {
65 treeItem = findTreeItem(tree, parentItemId);
67 treeItem.status = TreeItemStatus.Loaded;
70 const items = projects.map(p => ({
74 status: TreeItemStatus.Initial,
77 } as TreeItem<Project>));
80 treeItem.items = items;
87 const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, action: ProjectAction) => {
88 return actions.match(action, {
89 CREATE_PROJECT: project => ({
91 items: state.items.concat({
95 status: TreeItemStatus.Loaded,
101 REMOVE_PROJECT: () => state,
102 PROJECTS_REQUEST: itemId => {
103 const items = _.cloneDeep(state.items);
104 const item = findTreeItem(items, itemId);
106 item.status = TreeItemStatus.Pending;
111 PROJECTS_SUCCESS: ({ projects, parentItemId }) => {
114 items: updateProjectTree(state.items, projects, parentItemId)
117 TOGGLE_PROJECT_TREE_ITEM: itemId => {
118 const items = _.cloneDeep(state.items);
119 resetTreeActivity(items);
120 const item = findTreeItem(items, itemId);
122 item.open = !item.open;
128 currentItemId: itemId
135 export default projectsReducer;