19231: Add smaller page sizes (10 and 20 items) to load faster
[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
22 type CssRules = 'root';
23
24 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
25     root: {
26         width: '100%',
27     }
28 });
29
30
31 export enum ApiClientAuthorizationPanelColumnNames {
32     UUID = 'UUID',
33     API_CLIENT_ID = 'API Client ID',
34     API_TOKEN = 'API Token',
35     CREATED_BY_IP_ADDRESS = 'Created by IP address',
36     DEFAULT_OWNER_UUID = 'Default owner',
37     EXPIRES_AT = 'Expires at',
38     LAST_USED_AT = 'Last used at',
39     LAST_USED_BY_IP_ADDRESS = 'Last used by IP address',
40     SCOPES = 'Scopes',
41     USER_ID = 'User ID'
42 }
43
44 export const apiClientAuthorizationPanelColumns: DataColumns<string> = [
45     {
46         name: ApiClientAuthorizationPanelColumnNames.UUID,
47         selected: true,
48         configurable: true,
49         sortDirection: SortDirection.NONE,
50         filters: createTree(),
51         render: uuid => <CommonUuid uuid={uuid} />
52     },
53     {
54         name: ApiClientAuthorizationPanelColumnNames.API_CLIENT_ID,
55         selected: true,
56         configurable: true,
57         filters: createTree(),
58         render: uuid => <TokenApiClientId uuid={uuid} />
59     },
60     {
61         name: ApiClientAuthorizationPanelColumnNames.API_TOKEN,
62         selected: true,
63         configurable: true,
64         filters: createTree(),
65         render: uuid => <TokenApiToken uuid={uuid} />
66     },
67     {
68         name: ApiClientAuthorizationPanelColumnNames.CREATED_BY_IP_ADDRESS,
69         selected: true,
70         configurable: true,
71         filters: createTree(),
72         render: uuid => <TokenCreatedByIpAddress uuid={uuid} />
73     },
74     {
75         name: ApiClientAuthorizationPanelColumnNames.DEFAULT_OWNER_UUID,
76         selected: true,
77         configurable: true,
78         filters: createTree(),
79         render: uuid => <TokenDefaultOwnerUuid uuid={uuid} />
80     },
81     {
82         name: ApiClientAuthorizationPanelColumnNames.EXPIRES_AT,
83         selected: true,
84         configurable: true,
85         filters: createTree(),
86         render: uuid => <TokenExpiresAt uuid={uuid} />
87     },
88     {
89         name: ApiClientAuthorizationPanelColumnNames.LAST_USED_AT,
90         selected: true,
91         configurable: true,
92         filters: createTree(),
93         render: uuid => <TokenLastUsedAt uuid={uuid} />
94     },
95     {
96         name: ApiClientAuthorizationPanelColumnNames.LAST_USED_BY_IP_ADDRESS,
97         selected: true,
98         configurable: true,
99         filters: createTree(),
100         render: uuid => <TokenLastUsedByIpAddress uuid={uuid} />
101     },
102     {
103         name: ApiClientAuthorizationPanelColumnNames.SCOPES,
104         selected: true,
105         configurable: true,
106         filters: createTree(),
107         render: uuid => <TokenScopes uuid={uuid} />
108     },
109     {
110         name: ApiClientAuthorizationPanelColumnNames.USER_ID,
111         selected: true,
112         configurable: true,
113         filters: createTree(),
114         render: uuid => <TokenUserId uuid={uuid} />
115     }
116 ];
117
118 const DEFAULT_MESSAGE = 'Your api client authorization list is empty.';
119
120 export interface ApiClientAuthorizationPanelRootActionProps {
121     onItemClick: (item: string) => void;
122     onContextMenu: (event: React.MouseEvent<HTMLElement>, item: string) => void;
123     onItemDoubleClick: (item: string) => void;
124 }
125
126 export interface ApiClientAuthorizationPanelRootDataProps {
127     resources: ResourcesState;
128 }
129
130 type ApiClientAuthorizationPanelRootProps = ApiClientAuthorizationPanelRootActionProps
131     & ApiClientAuthorizationPanelRootDataProps & WithStyles<CssRules>;
132
133 export const ApiClientAuthorizationPanelRoot = withStyles(styles)(
134     ({ classes, onItemDoubleClick, onItemClick, onContextMenu }: ApiClientAuthorizationPanelRootProps) =>
135         <div className={classes.root}><DataExplorer
136             id={API_CLIENT_AUTHORIZATION_PANEL_ID}
137             onRowClick={onItemClick}
138             onRowDoubleClick={onItemDoubleClick}
139             onContextMenu={onContextMenu}
140             contextMenuColumn={true}
141             hideColumnSelector
142             hideSearchInput
143             defaultViewIcon={ShareMeIcon}
144             defaultViewMessages={[DEFAULT_MESSAGE]} />
145         </div>
146 );