From 7ace628b611d7674e420262d9fc5e757e8c686a6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Kuty=C5=82a?= Date: Wed, 9 Mar 2022 17:36:48 +0100 Subject: [PATCH] 18549: New implementation with snackbar MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła --- .../collection-service/collection-service.ts | 12 ++++-- src/services/common-service/common-service.ts | 14 ++++-- .../search-results-panel-view.tsx | 43 ++++++++++++------- .../search-results-panel.tsx | 12 +++++- 4 files changed, 59 insertions(+), 22 deletions(-) diff --git a/src/services/collection-service/collection-service.ts b/src/services/collection-service/collection-service.ts index b6272650..a3a7cf8f 100644 --- a/src/services/collection-service/collection-service.ts +++ b/src/services/collection-service/collection-service.ts @@ -13,6 +13,7 @@ import { ApiActions } from "services/api/api-actions"; import { customEncodeURI } from "common/url"; import { FilterBuilder } from "services/api/filter-builder"; import { ListArguments } from "services/common-service/common-service"; +import { Session } from "models/session"; export type UploadProgress = (fileId: number, loaded: number, total: number, currentTime: number) => void; @@ -30,7 +31,7 @@ export class CollectionService extends TrashableResourceService) { diff --git a/src/services/common-service/common-service.ts b/src/services/common-service/common-service.ts index f66fad74..ddaf2ab0 100644 --- a/src/services/common-service/common-service.ts +++ b/src/services/common-service/common-service.ts @@ -3,10 +3,11 @@ // SPDX-License-Identifier: AGPL-3.0 import { camelCase, isPlainObject, isArray, snakeCase } from "lodash"; -import { AxiosInstance, AxiosPromise } from "axios"; +import { AxiosInstance, AxiosPromise, AxiosRequestConfig } from "axios"; import uuid from "uuid/v4"; import { ApiActions } from "services/api/api-actions"; import QueryString from "query-string"; +import { Session } from "models/session"; interface Errors { status: number; @@ -113,11 +114,18 @@ export class CommonService { ); } - get(uuid: string, showErrors?: boolean) { + get(uuid: string, showErrors?: boolean, select?: string[], session?: Session) { this.validateUuid(uuid); + + const cfg: AxiosRequestConfig = {}; + if (session) { + cfg.baseURL = session.baseUrl; + cfg.headers = { 'Authorization': 'Bearer ' + session.token }; + } + return CommonService.defaultResponse( this.serverApi - .get(`/${this.resourceType}/${uuid}`), + .get(`/${this.resourceType}/${uuid}`, session ? cfg : undefined), this.actions, true, // mapKeys showErrors diff --git a/src/views/search-results-panel/search-results-panel-view.tsx b/src/views/search-results-panel/search-results-panel-view.tsx index 6febabf2..fd420b83 100644 --- a/src/views/search-results-panel/search-results-panel-view.tsx +++ b/src/views/search-results-panel/search-results-panel-view.tsx @@ -27,6 +27,7 @@ import { Routes } from 'routes/routes'; import { Link } from 'react-router-dom'; import { StyleRulesCallback, withStyles, WithStyles } from '@material-ui/core'; import { ArvadosTheme } from 'common/custom-theme'; +import { getSearchSessions } from 'store/search-bar/search-bar-actions'; export enum SearchResultsPanelColumnNames { CLUSTER = "Cluster", @@ -110,38 +111,50 @@ export const SearchResultsPanelView = withStyles(styles, { withTheme: true })( const homeCluster = props.user.uuid.substring(0, 5); const loggedIn = props.sessions.filter((ss) => ss.loggedIn && ss.userIsActive); const [selectedItem, setSelectedItem] = useState(''); - let itemPath: string[] = []; useEffect(() => { - if (selectedItem !== '') { - itemPath = []; + let itemPath: string[] = []; - (async () => { + (async () => { + if (selectedItem !== '') { let searchUuid = selectedItem; let itemKind = extractUuidKind(searchUuid); while (itemKind !== ResourceKind.USER) { - console.log(itemKind); - const { name, ownerUuid } = await servicesProvider.getServices().groupsService.get(searchUuid); - itemKind = extractUuidKind(ownerUuid); - searchUuid = ownerUuid; - itemPath.push(name); + const clusterId = searchUuid.split('-')[0]; + const serviceType = itemKind?.replace('arvados#', ''); + const service = Object.values(servicesProvider.getServices()) + .filter(({resourceType}) => !!resourceType) + .find(({resourceType}) => resourceType.indexOf(serviceType) > -1); + const sessions = getSearchSessions(clusterId, props.sessions); + + if (sessions.length > 0) { + const session = sessions[0]; + const { name, ownerUuid } = await (service as any).get(searchUuid, false, session); + itemPath.push(name); + searchUuid = ownerUuid; + itemKind = extractUuidKind(searchUuid); + } else { + break; + } } - const rootFolder = props.user.uuid === searchUuid ? 'Projects' : 'Shared with me'; - itemPath.push(rootFolder); + itemPath.push(props.user.uuid === searchUuid ? 'Projects' : 'Shared with me'); + props.onPathDisplay(`/ ${itemPath.reverse().join(' / ')}`); + } + })(); - console.log(itemPath.reverse().join('/')); - })(); - } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedItem]); const onItemClick = useCallback((uuid) => { setSelectedItem(uuid); props.onItemClick(uuid); + // eslint-disable-next-line react-hooks/exhaustive-deps },[props.onItemClick]); - return + , item: string) => void; onDialogOpen: (ownerUuid: string) => void; onItemDoubleClick: (item: string) => void; + onPathDisplay: (path: string) => void; } export type SearchResultsPanelProps = SearchResultsPanelDataProps & SearchResultsPanelActionProps; @@ -49,7 +51,15 @@ const mapDispatchToProps = (dispatch: Dispatch): SearchResultsPanelActionProps = }, onItemDoubleClick: uuid => { dispatch(navigateTo(uuid)); - } + }, + onPathDisplay: (path: string) => { + dispatch(snackbarActions.SHIFT_MESSAGES()); + dispatch(snackbarActions.OPEN_SNACKBAR({ + message: path, + kind: SnackbarKind.INFO, + hideDuration: 9999999999, + })); + }, }); export const SearchResultsPanel = connect(mapStateToProps, mapDispatchToProps)(SearchResultsPanelView); -- 2.30.2