X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/533c057d79a87e7e48249d60fa5b45a9b4dd6823..62cb779efb0b098c05053e957c765a807467b28b:/src/views-components/projects-tree-picker/generic-projects-tree-picker.tsx diff --git a/src/views-components/projects-tree-picker/generic-projects-tree-picker.tsx b/src/views-components/projects-tree-picker/generic-projects-tree-picker.tsx index 21839ff5..11b51caa 100644 --- a/src/views-components/projects-tree-picker/generic-projects-tree-picker.tsx +++ b/src/views-components/projects-tree-picker/generic-projects-tree-picker.tsx @@ -2,26 +2,22 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from "react"; +import 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"; +import { isEqual } from 'lodash/fp'; +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, FileInputIcon, IconType, CollectionIcon } from 'components/icon/icon'; +import { loadProject, loadCollection } from 'store/tree-picker/tree-picker-actions'; +import { ProjectsTreePickerItem, ProjectsTreePickerRootItem } from 'store/tree-picker/tree-picker-middleware'; +import { ResourceKind } from 'models/resource'; +import { TreePickerProps, TreePicker } from "views-components/tree-picker/tree-picker"; +import { CollectionFileType } from 'models/collection-file'; -export interface ProjectsTreePickerRootItem { - id: string; - name: string; -} -export type ProjectsTreePickerItem = ProjectsTreePickerRootItem | GroupContentsResource | CollectionDirectory | CollectionFile; type PickedTreePickerProps = Pick, 'onContextMenu' | 'toggleItemActive' | 'toggleItemOpen' | 'toggleItemSelection'>; export interface ProjectsTreePickerDataProps { @@ -29,7 +25,11 @@ export interface ProjectsTreePickerDataProps { includeFiles?: boolean; rootItemIcon: IconType; showSelection?: boolean; - loadRootItem: (item: TreeItem, pickerId: string, includeCollections?: boolean, inlcudeFiles?: boolean) => void; + relatedTreePickers?: string[]; + disableActivation?: string[]; + options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }; + loadRootItem: (item: TreeItem, pickerId: string, + includeCollections?: boolean, includeFiles?: boolean, options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }) => void; } export type ProjectsTreePickerProps = ProjectsTreePickerDataProps & Partial; @@ -39,10 +39,16 @@ const mapStateToProps = (_: any, { rootItemIcon, showSelection }: ProjectsTreePi showSelection: isSelectionVisible(showSelection), }); -const mapDispatchToProps = (dispatch: Dispatch, { loadRootItem, includeCollections, includeFiles, ...props }: ProjectsTreePickerProps): PickedTreePickerProps => ({ +const mapDispatchToProps = (dispatch: Dispatch, { loadRootItem, includeCollections, includeFiles, relatedTreePickers, options, ...props }: ProjectsTreePickerProps): PickedTreePickerProps => ({ onContextMenu: () => { return; }, toggleItemActive: (event, item, pickerId) => { - dispatch(treePickerActions.ACTIVATE_TREE_PICKER_NODE({ id: item.id, pickerId })); + + const { disableActivation = [] } = props; + if (disableActivation.some(isEqual(item.id))) { + return; + } + + dispatch(treePickerActions.ACTIVATE_TREE_PICKER_NODE({ id: item.id, pickerId, relatedTreePickers })); if (props.toggleItemActive) { props.toggleItemActive(event, item, pickerId); } @@ -54,23 +60,34 @@ const mapDispatchToProps = (dispatch: Dispatch, { loadRootItem, includeCollectio dispatch( data.kind === ResourceKind.COLLECTION ? loadCollection(id, pickerId) - : loadProject({ id, pickerId, includeCollections, includeFiles }) + : loadProject({ id, pickerId, includeCollections, includeFiles, options }) ); } else if (!('type' in data) && loadRootItem) { - loadRootItem(item as TreeItem, pickerId, includeCollections, includeFiles); + loadRootItem(item as TreeItem, pickerId, includeCollections, includeFiles, options); } } 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 })); + toggleItemSelection: (event, item, pickerId) => { + dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_SELECTION({ id: item.id, pickerId })); + if (props.toggleItemSelection) { + props.toggleItemSelection(event, item, pickerId); + } }, }); export const ProjectsTreePicker = connect(mapStateToProps, mapDispatchToProps)(TreePicker); const getProjectPickerIcon = ({ data }: TreeItem, rootIcon: IconType): IconType => { + if ('headKind' in data) { + switch (data.headKind) { + case ResourceKind.COLLECTION: + return CollectionIcon; + default: + return ProjectIcon; + } + } if ('kind' in data) { switch (data.kind) { case ResourceKind.COLLECTION: @@ -81,7 +98,7 @@ const getProjectPickerIcon = ({ data }: TreeItem, rootIc } else if ('type' in data) { switch (data.type) { case CollectionFileType.FILE: - return InputIcon; + return FileInputIcon; default: return ProjectIcon; }