Merge branch '21128-toolbar-context-menu'
[arvados-workbench2.git] / src / views / api-client-authorization-panel / api-client-authorization-panel-root.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import React from 'react';
6 import {
7     StyleRulesCallback, WithStyles, withStyles
8 } from '@material-ui/core';
9 import { ArvadosTheme } from 'common/custom-theme';
10 import { ShareMeIcon } from 'components/icon/icon';
11 import { createTree } from 'models/tree';
12 import { DataColumns } from 'components/data-table/data-table';
13 import { SortDirection } from 'components/data-table/data-column';
14 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from '../../store/api-client-authorizations/api-client-authorizations-actions';
15 import { DataExplorer } from 'views-components/data-explorer/data-explorer';
16 import { ResourcesState } from 'store/resources/resources';
17 import {
18     CommonUuid, TokenApiClientId, TokenApiToken, TokenCreatedByIpAddress, TokenDefaultOwnerUuid, TokenExpiresAt,
19     TokenLastUsedAt, TokenLastUsedByIpAddress, TokenScopes, TokenUserId
20 } from 'views-components/data-explorer/renderers';
21 import { ApiClientAuthorization } from 'models/api-client-authorization';
22
23 type CssRules = 'root';
24
25 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
26     root: {
27         width: '100%',
28     }
29 });
30
31
32 export enum ApiClientAuthorizationPanelColumnNames {
33     UUID = 'UUID',
34     API_CLIENT_ID = 'API Client ID',
35     API_TOKEN = 'API Token',
36     CREATED_BY_IP_ADDRESS = 'Created by IP address',
37     DEFAULT_OWNER_UUID = 'Default owner',
38     EXPIRES_AT = 'Expires at',
39     LAST_USED_AT = 'Last used at',
40     LAST_USED_BY_IP_ADDRESS = 'Last used by IP address',
41     SCOPES = 'Scopes',
42     USER_ID = 'User ID'
43 }
44
45 export const apiClientAuthorizationPanelColumns: DataColumns<string, ApiClientAuthorization> = [
46     {
47         name: ApiClientAuthorizationPanelColumnNames.UUID,
48         selected: true,
49         configurable: true,
50         sort: {direction: SortDirection.NONE, field: "uuid"},
51         filters: createTree(),
52         render: uuid => <CommonUuid uuid={uuid} />
53     },
54     {
55         name: ApiClientAuthorizationPanelColumnNames.API_CLIENT_ID,
56         selected: true,
57         configurable: true,
58         filters: createTree(),
59         render: uuid => <TokenApiClientId uuid={uuid} />
60     },
61     {
62         name: ApiClientAuthorizationPanelColumnNames.API_TOKEN,
63         selected: true,
64         configurable: true,
65         filters: createTree(),
66         render: uuid => <TokenApiToken uuid={uuid} />
67     },
68     {
69         name: ApiClientAuthorizationPanelColumnNames.CREATED_BY_IP_ADDRESS,
70         selected: true,
71         configurable: true,
72         filters: createTree(),
73         render: uuid => <TokenCreatedByIpAddress uuid={uuid} />
74     },
75     {
76         name: ApiClientAuthorizationPanelColumnNames.DEFAULT_OWNER_UUID,
77         selected: true,
78         configurable: true,
79         filters: createTree(),
80         render: uuid => <TokenDefaultOwnerUuid uuid={uuid} />
81     },
82     {
83         name: ApiClientAuthorizationPanelColumnNames.EXPIRES_AT,
84         selected: true,
85         configurable: true,
86         filters: createTree(),
87         render: uuid => <TokenExpiresAt uuid={uuid} />
88     },
89     {
90         name: ApiClientAuthorizationPanelColumnNames.LAST_USED_AT,
91         selected: true,
92         configurable: true,
93         filters: createTree(),
94         render: uuid => <TokenLastUsedAt uuid={uuid} />
95     },
96     {
97         name: ApiClientAuthorizationPanelColumnNames.LAST_USED_BY_IP_ADDRESS,
98         selected: true,
99         configurable: true,
100         filters: createTree(),
101         render: uuid => <TokenLastUsedByIpAddress uuid={uuid} />
102     },
103     {
104         name: ApiClientAuthorizationPanelColumnNames.SCOPES,
105         selected: true,
106         configurable: true,
107         filters: createTree(),
108         render: uuid => <TokenScopes uuid={uuid} />
109     },
110     {
111         name: ApiClientAuthorizationPanelColumnNames.USER_ID,
112         selected: true,
113         configurable: true,
114         filters: createTree(),
115         render: uuid => <TokenUserId uuid={uuid} />
116     }
117 ];
118
119 const DEFAULT_MESSAGE = 'Your api client authorization list is empty.';
120
121 export interface ApiClientAuthorizationPanelRootActionProps {
122     onItemClick: (item: string) => void;
123     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: string) => void;
124     onItemDoubleClick: (item: string) => void;
125 }
126
127 export interface ApiClientAuthorizationPanelRootDataProps {
128     resources: ResourcesState;
129 }
130
131 type ApiClientAuthorizationPanelRootProps = ApiClientAuthorizationPanelRootActionProps
132     & ApiClientAuthorizationPanelRootDataProps & WithStyles<CssRules>;
133
134 export const ApiClientAuthorizationPanelRoot = withStyles(styles)(
135     ({ classes, onItemDoubleClick, onItemClick, onContextMenu }: ApiClientAuthorizationPanelRootProps) =>
136         <div className={classes.root}><DataExplorer
137             id={API_CLIENT_AUTHORIZATION_PANEL_ID}
138             onRowClick={onItemClick}
139             onRowDoubleClick={onItemDoubleClick}
140             onContextMenu={onContextMenu}
141             contextMenuColumn={true}
142             hideColumnSelector
143             hideSearchInput
144             defaultViewIcon={ShareMeIcon}
145             defaultViewMessages={[DEFAULT_MESSAGE]} />
146         </div>
147 );