X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/8775768ca3a344775c81b7278a50d56d9be3f9b6..454ef1c106b3d738526d65ecfae8db98ad7bebc2:/src/views-components/projects-tree-picker/projects-tree-picker.tsx diff --git a/src/views-components/projects-tree-picker/projects-tree-picker.tsx b/src/views-components/projects-tree-picker/projects-tree-picker.tsx index ac6d76e6..ae98cf00 100644 --- a/src/views-components/projects-tree-picker/projects-tree-picker.tsx +++ b/src/views-components/projects-tree-picker/projects-tree-picker.tsx @@ -2,97 +2,38 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from "react"; -import { Dispatch } from "redux"; -import { connect } from "react-redux"; -import { TreeItem, TreeItemStatus } from '~/components/tree/tree'; -import { ProjectResource } from "~/models/project"; -import { treePickerActions } from "~/store/tree-picker/tree-picker-actions"; -import { ListItemTextIcon } from "~/components/list-item-text-icon/list-item-text-icon"; -import { ProjectIcon, InputIcon, IconType, CollectionIcon } from '~/components/icon/icon'; -import { loadProject, loadCollection } from '~/store/tree-picker/tree-picker-actions'; -import { GroupContentsResource } from '~/services/groups-service/groups-service'; -import { CollectionDirectory, CollectionFile, CollectionFileType } from '~/models/collection-file'; -import { ResourceKind } from '~/models/resource'; -import { TreePickerProps, TreePicker } from "~/views-components/tree-picker/tree-picker"; - -export interface ProjectsTreePickerRootItem { - id: string; - name: string; -} - -type ProjectsTreePickerItem = ProjectsTreePickerRootItem | GroupContentsResource | CollectionDirectory | CollectionFile; -type PickedTreePickerProps = Pick, 'onContextMenu' | 'toggleItemActive' | 'toggleItemOpen' | 'toggleItemSelection'>; - -export interface ProjectsTreePickerDataProps { +import * as React from 'react'; +import { values, memoize, pipe, pick } from 'lodash/fp'; +import { HomeTreePicker } from '~/views-components/projects-tree-picker/home-tree-picker'; +import { SharedTreePicker } from '~/views-components/projects-tree-picker/shared-tree-picker'; +import { FavoritesTreePicker } from '~/views-components/projects-tree-picker/favorites-tree-picker'; +import { getProjectsTreePickerIds, SHARED_PROJECT_ID, FAVORITES_PROJECT_ID } from '~/store/tree-picker/tree-picker-actions'; +import { TreeItem } from '~/components/tree/tree'; +import { ProjectsTreePickerItem } from './generic-projects-tree-picker'; + +export interface ProjectsTreePickerProps { pickerId: string; includeCollections?: boolean; includeFiles?: boolean; - rootItemIcon: IconType; - loadRootItem: (item: TreeItem, pickerId: string, includeCollections?: boolean, inlcudeFiles?: boolean) => void; -} - -export interface ProjectsTreePickerActionProps { + showSelection?: boolean; + toggleItemActive?: (event: React.MouseEvent, item: TreeItem, pickerId: string) => void; + toggleItemSelection?: (event: React.MouseEvent, item: TreeItem, pickerId: string) => void; } -export type ProjectsTreePickerProps = ProjectsTreePickerDataProps & ProjectsTreePickerActionProps; - -const mapStateToProps = (_: any, { pickerId, rootItemIcon }: ProjectsTreePickerProps) => ({ - render: renderTreeItem(rootItemIcon), - pickerId, -}); - -const mapDispatchToProps = (dispatch: Dispatch, props: ProjectsTreePickerProps): PickedTreePickerProps => ({ - onContextMenu: () => { return; }, - toggleItemActive: (_, { id }, pickerId) => { - dispatch(treePickerActions.ACTIVATE_TREE_PICKER_NODE({ id, pickerId })); - }, - toggleItemOpen: (_, item, pickerId) => { - const { id, data, status } = item; - if (status === TreeItemStatus.INITIAL) { - if ('kind' in data) { - dispatch( - data.kind === ResourceKind.COLLECTION - ? loadCollection(id, pickerId) - : loadProject(id, pickerId, props.includeCollections, props.includeFiles) - ); - } else if (!('type' in data) && props.loadRootItem) { - props.loadRootItem(item as TreeItem, pickerId, props.includeCollections, props.includeFiles); - } - } else if (status === TreeItemStatus.LOADED) { - dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_COLLAPSE({ id, pickerId })); - } - }, - toggleItemSelection: (_, { id }, pickerId) => { - dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_SELECTION({ id, pickerId })); - }, -}); - -export const ProjectsTreePicker = connect(mapStateToProps, mapDispatchToProps)(TreePicker); - -const getProjectPickerIcon = ({ data }: TreeItem, rootIcon: IconType): IconType => { - if ('kind' in data) { - switch (data.kind) { - case ResourceKind.COLLECTION: - return CollectionIcon; - default: - return ProjectIcon; - } - } else if ('type' in data) { - switch (data.type) { - case CollectionFileType.FILE: - return InputIcon; - default: - return ProjectIcon; - } - } else { - return rootIcon; - } +export const ProjectsTreePicker = ({ pickerId, ...props }: ProjectsTreePickerProps) => { + const { home, shared, favorites } = getProjectsTreePickerIds(pickerId); + const relatedTreePickers = getRelatedTreePickers(pickerId); + const p = { + ...props, + relatedTreePickers, + disableActivation + }; + return
+ + + +
; }; -const renderTreeItem = (rootItemIcon: IconType) => (item: TreeItem) => - ; +const getRelatedTreePickers = memoize(pipe(getProjectsTreePickerIds, values)); +const disableActivation = [SHARED_PROJECT_ID, FAVORITES_PROJECT_ID];