import { ContainerRequestState } from '~/models/container-request';
import { MountKind } from '~/models/mount-types';
import { receiveTreePickerData, loadUserProject } from '~/store/tree-picker/tree-picker-actions';
-import { loadProject, loadCollection, initUserProject, initSharedProject } from './store/tree-picker/tree-picker-actions';
+import { loadProject, loadCollection, initUserProject, initSharedProject, initFavoritesProject } from './store/tree-picker/tree-picker-actions';
import { ResourceKind } from '~/models/resource';
const getBuildNumber = () => "BN-" + (process.env.REACT_APP_BUILD_NUMBER || "dev");
store.dispatch(initSharedProject('testPicker4'));
store.dispatch(initSharedProject('testPicker5'));
store.dispatch(initSharedProject('testPicker6'));
+ store.dispatch(initFavoritesProject('testPicker7'));
+ store.dispatch(initFavoritesProject('testPicker8'));
+ store.dispatch(initFavoritesProject('testPicker9'));
// await store.dispatch(loadCollection(
// 'c97qk-4zz18-9sn8ygaf62chkkd',
// 'testPicker',
async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
const uuid = services.authService.getUuid();
if (uuid) {
- dispatch(loadProject({id: uuid, pickerId, includeCollections, includeFiles}));
+ dispatch(loadProject({ id: uuid, pickerId, includeCollections, includeFiles }));
}
};
}),
}));
};
+
+export const initFavoritesProject = (pickerId: string) =>
+ async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ dispatch(receiveTreePickerData({
+ id: '',
+ pickerId,
+ data: [{ uuid: 'Favorites', name: 'Favorites' }],
+ extractNodeData: value => ({
+ id: value.uuid,
+ status: TreeNodeStatus.INITIAL,
+ value,
+ }),
+ }));
+ };
+
+interface LoadFavoritesProjectParams {
+ pickerId: string;
+ includeCollections?: boolean;
+ includeFiles?: boolean;
+}
+export const loadFavoritesProject = (params: LoadFavoritesProjectParams) =>
+ async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+ const { pickerId, includeCollections = false, includeFiles = false } = params;
+ const uuid = services.authService.getUuid();
+ if (uuid) {
+
+ const filters = pipe(
+ (fb: FilterBuilder) => includeCollections
+ ? fb.addIsA('headUuid', [ResourceKind.PROJECT, ResourceKind.COLLECTION])
+ : fb.addIsA('headUuid', [ResourceKind.PROJECT]),
+ fb => fb.getFilters(),
+ )(new FilterBuilder());
+
+ const { items } = await services.favoriteService.list(uuid, { filters });
+
+ dispatch<any>(receiveTreePickerData<GroupContentsResource>({
+ id: 'Favorites',
+ pickerId,
+ data: items,
+ extractNodeData: item => ({
+ id: item.uuid,
+ value: item,
+ status: item.kind === ResourceKind.PROJECT
+ ? TreeNodeStatus.INITIAL
+ : includeFiles
+ ? TreeNodeStatus.INITIAL
+ : TreeNodeStatus.LOADED
+ }),
+ }));
+ }
+ };
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { connect } from 'react-redux';
+import { ProjectsTreePicker, ProjectsTreePickerProps } from '~/views-components/projects-tree-picker/projects-tree-picker';
+import { Dispatch } from 'redux';
+import { FavoriteIcon } from '~/components/icon/icon';
+import { loadFavoritesProject } from '~/store/tree-picker/tree-picker-actions';
+
+export const FavoritesProjectsTreePicker = connect(() => ({
+ rootItemIcon: FavoriteIcon,
+}), (dispatch: Dispatch): Pick<ProjectsTreePickerProps, 'loadRootItem'> => ({
+ loadRootItem: (_, pickerId, includeCollections, includeFiles) => {
+ dispatch<any>(loadFavoritesProject({ pickerId, includeCollections, includeFiles }));
+ },
+}))(ProjectsTreePicker);
\ No newline at end of file
const memoizedMapStateToProps = () => {
let prevTree: Ttree<any>;
- let mappedProps: Pick<TreeProps<any>, 'items'>;
- return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items'> => {
+ let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple'>;
+ return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple'> => {
const tree = state.treePicker[props.pickerId] || createTree();
if (tree !== prevTree) {
prevTree = tree;
mappedProps = {
+ disableRipple: true,
items: getNodeChildrenIds('')(tree)
.map(treePickerToTreeItems(tree))
};
import { ProjectsTreePicker } from '~/views-components/projects-tree-picker/projects-tree-picker';
import { UserProjectsTreePicker } from '~/views-components/projects-tree-picker/user-projects-tree-picker';
import { SharedProjectsTreePicker } from '~/views-components/projects-tree-picker/shared-projects-tree-picker';
+import { FavoritesProjectsTreePicker } from '../../views-components/projects-tree-picker/favorites-tree-picker';
type CssRules = 'root' | 'container' | 'splitter' | 'asidePanel' | 'contentWrapper' | 'content';
<SharedProjectsTreePicker pickerId='testPicker4'/>
<SharedProjectsTreePicker pickerId='testPicker5' includeCollections/>
<SharedProjectsTreePicker pickerId='testPicker6' includeCollections includeFiles/>
+ <FavoritesProjectsTreePicker pickerId='testPicker7'/>
+ <FavoritesProjectsTreePicker pickerId='testPicker8' includeCollections/>
+ <FavoritesProjectsTreePicker pickerId='testPicker9' includeCollections includeFiles/>
<Switch>
<Route path={Routes.PROJECTS} component={ProjectPanel} />
<Route path={Routes.COLLECTIONS} component={CollectionPanel} />