15530: Search panel has link to site manager
[arvados-workbench2.git] / src / views / search-results-panel / search-results-panel-view.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from 'react';
6 import { SortDirection } from '~/components/data-table/data-column';
7 import { DataColumns } from '~/components/data-table/data-table';
8 import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
9 import { ResourceKind } from '~/models/resource';
10 import { ContainerRequestState } from '~/models/container-request';
11 import { SEARCH_RESULTS_PANEL_ID } from '~/store/search-results-panel/search-results-panel-actions';
12 import { DataExplorer } from '~/views-components/data-explorer/data-explorer';
13 import {
14     ProcessStatus, ResourceCluster,
15     ResourceFileSize,
16     ResourceLastModifiedDate,
17     ResourceName,
18     ResourceOwner,
19     ResourceType
20 } from '~/views-components/data-explorer/renderers';
21 import { createTree } from '~/models/tree';
22 import { getInitialResourceTypeFilters } from '~/store/resource-type-filters/resource-type-filters';
23 import { SearchResultsPanelProps } from "./search-results-panel";
24 import { Link } from 'react-router-dom';
25 import { Routes } from '~/routes/routes';
26
27 export enum SearchResultsPanelColumnNames {
28     CLUSTER = "Cluster",
29     NAME = "Name",
30     PROJECT = "Project",
31     STATUS = "Status",
32     TYPE = 'Type',
33     OWNER = "Owner",
34     FILE_SIZE = "File size",
35     LAST_MODIFIED = "Last modified"
36 }
37
38 export interface WorkflowPanelFilter extends DataTableFilterItem {
39     type: ResourceKind | ContainerRequestState;
40 }
41
42 export const searchResultsPanelColumns: DataColumns<string> = [
43     {
44         name: SearchResultsPanelColumnNames.CLUSTER,
45         selected: true,
46         configurable: true,
47         filters: createTree(),
48         render: (uuid: string) => <ResourceCluster uuid={uuid} />
49     },
50     {
51         name: SearchResultsPanelColumnNames.NAME,
52         selected: true,
53         configurable: true,
54         sortDirection: SortDirection.NONE,
55         filters: createTree(),
56         render: (uuid: string) => <ResourceName uuid={uuid} />
57     },
58     {
59         name: SearchResultsPanelColumnNames.PROJECT,
60         selected: true,
61         configurable: true,
62         filters: createTree(),
63         render: uuid => <ResourceFileSize uuid={uuid} />
64     },
65     {
66         name: SearchResultsPanelColumnNames.STATUS,
67         selected: true,
68         configurable: true,
69         filters: createTree(),
70         render: uuid => <ProcessStatus uuid={uuid} />
71     },
72     {
73         name: SearchResultsPanelColumnNames.TYPE,
74         selected: true,
75         configurable: true,
76         filters: getInitialResourceTypeFilters(),
77         render: (uuid: string) => <ResourceType uuid={uuid} />,
78     },
79     {
80         name: SearchResultsPanelColumnNames.OWNER,
81         selected: true,
82         configurable: true,
83         filters: createTree(),
84         render: uuid => <ResourceOwner uuid={uuid} />
85     },
86     {
87         name: SearchResultsPanelColumnNames.FILE_SIZE,
88         selected: true,
89         configurable: true,
90         filters: createTree(),
91         render: uuid => <ResourceFileSize uuid={uuid} />
92     },
93     {
94         name: SearchResultsPanelColumnNames.LAST_MODIFIED,
95         selected: true,
96         configurable: true,
97         sortDirection: SortDirection.DESC,
98         filters: createTree(),
99         render: uuid => <ResourceLastModifiedDate uuid={uuid} />
100     }
101 ];
102
103 export const SearchResultsPanelView = (props: SearchResultsPanelProps) => {
104     const homeCluster = props.user.uuid.substr(0, 5);
105     const loggedIn = props.sessions.filter((ss) => ss.loggedIn);
106     return <DataExplorer
107         id={SEARCH_RESULTS_PANEL_ID}
108         onRowClick={props.onItemClick}
109         onRowDoubleClick={props.onItemDoubleClick}
110         onContextMenu={props.onContextMenu}
111         contextMenuColumn={false}
112         hideSearchInput
113         title={
114             <div>{(props.localCluster !== homeCluster && loggedIn.length === 1) ?
115                 <span>Searching local cluster {props.localCluster} only.  To search multiple clusters, <a href={props.remoteHostsConfig[homeCluster] && props.remoteHostsConfig[homeCluster].workbench2Url}> start from your home Workbench.</a></span> :
116                 <span>Searching clusters: {loggedIn.map((ss) => <span key={ss.clusterId}> {ss.clusterId}</span>)}</span>}
117                 <Link to={Routes.SITE_MANAGER} style={{ marginLeft: "2em" }}>Site Manager</Link>
118             </div>
119         }
120     />;
121 };