merge master
[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 { resourceLabel } from '~/common/labels';
12 import { SearchBarAdvanceFormData } from '~/store/search-bar/search-bar-actions';
13 import { SEARCH_RESULTS_PANEL_ID } from '~/store/search-results-panel/search-results-panel-actions';
14 import { DataExplorer } from '~/views-components/data-explorer/data-explorer';
15 import {
16     ProcessStatus,
17     ResourceFileSize,
18     ResourceLastModifiedDate,
19     ResourceName,
20     ResourceOwner,
21     ResourceType
22 } from '~/views-components/data-explorer/renderers';
23
24 export enum SearchResultsPanelColumnNames {
25     NAME = "Name",
26     PROJECT = "Project",
27     STATUS = "Status",
28     TYPE = 'Type',
29     OWNER = "Owner",
30     FILE_SIZE = "File size",
31     LAST_MODIFIED = "Last modified"
32 }
33
34 export interface SearchResultsPanelDataProps {
35     data: SearchBarAdvanceFormData;
36 }
37
38 export interface SearchResultsPanelActionProps {
39     onItemClick: (item: string) => void;
40     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: string) => void;
41     onDialogOpen: (ownerUuid: string) => void;
42     onItemDoubleClick: (item: string) => void;
43 }
44
45 export type SearchResultsPanelProps = SearchResultsPanelDataProps & SearchResultsPanelActionProps;
46
47 export interface WorkflowPanelFilter extends DataTableFilterItem {
48     type: ResourceKind | ContainerRequestState;
49 }
50
51 export const searchResultsPanelColumns: DataColumns<string, WorkflowPanelFilter> = [
52     {
53         name: SearchResultsPanelColumnNames.NAME,
54         selected: true,
55         configurable: true,
56         sortDirection: SortDirection.ASC,
57         filters: [],
58         render: (uuid: string) => <ResourceName uuid={uuid} />
59     },
60     {
61         name: SearchResultsPanelColumnNames.PROJECT,
62         selected: true,
63         configurable: true,
64         filters: [],
65         render: uuid => <ResourceFileSize uuid={uuid} />
66     },
67     {
68         name: SearchResultsPanelColumnNames.STATUS,
69         selected: true,
70         configurable: true,
71         filters: [],
72         render: uuid => <ProcessStatus uuid={uuid} />
73     },
74     {
75         name: SearchResultsPanelColumnNames.TYPE,
76         selected: true,
77         configurable: true,
78         filters: [
79             {
80                 name: resourceLabel(ResourceKind.COLLECTION),
81                 selected: true,
82                 type: ResourceKind.COLLECTION
83             },
84             {
85                 name: resourceLabel(ResourceKind.PROCESS),
86                 selected: true,
87                 type: ResourceKind.PROCESS
88             },
89             {
90                 name: resourceLabel(ResourceKind.PROJECT),
91                 selected: true,
92                 type: ResourceKind.PROJECT
93             }
94         ],
95         render: (uuid: string) => <ResourceType uuid={uuid} />,
96     },
97     {
98         name: SearchResultsPanelColumnNames.OWNER,
99         selected: true,
100         configurable: true,
101         filters: [],
102         render: uuid => <ResourceOwner uuid={uuid} />
103     },
104     {
105         name: SearchResultsPanelColumnNames.FILE_SIZE,
106         selected: true,
107         configurable: true,
108         filters: [],
109         render: uuid => <ResourceFileSize uuid={uuid} />
110     },
111     {
112         name: SearchResultsPanelColumnNames.LAST_MODIFIED,
113         selected: true,
114         configurable: true,
115         sortDirection: SortDirection.NONE,
116         filters: [],
117         render: uuid => <ResourceLastModifiedDate uuid={uuid} />
118     }
119 ];
120
121 export const SearchResultsPanelView = (props: SearchResultsPanelProps) => {
122     return <DataExplorer
123         id={SEARCH_RESULTS_PANEL_ID}
124         onRowClick={props.onItemClick}
125         onRowDoubleClick={props.onItemDoubleClick}
126         onContextMenu={props.onContextMenu}
127         contextMenuColumn={true} />;
128 };