1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
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';
18 CommonUuid, TokenApiClientId, TokenApiToken, TokenCreatedByIpAddress, TokenDefaultOwnerUuid, TokenExpiresAt,
19 TokenLastUsedAt, TokenLastUsedByIpAddress, TokenScopes, TokenUserId
20 } from 'views-components/data-explorer/renderers';
22 type CssRules = 'root';
24 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
31 export enum ApiClientAuthorizationPanelColumnNames {
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',
44 export const apiClientAuthorizationPanelColumns: DataColumns<string> = [
46 name: ApiClientAuthorizationPanelColumnNames.UUID,
49 sortDirection: SortDirection.NONE,
50 filters: createTree(),
51 render: uuid => <CommonUuid uuid={uuid} />
54 name: ApiClientAuthorizationPanelColumnNames.API_CLIENT_ID,
57 filters: createTree(),
58 render: uuid => <TokenApiClientId uuid={uuid} />
61 name: ApiClientAuthorizationPanelColumnNames.API_TOKEN,
64 filters: createTree(),
65 render: uuid => <TokenApiToken uuid={uuid} />
68 name: ApiClientAuthorizationPanelColumnNames.CREATED_BY_IP_ADDRESS,
71 filters: createTree(),
72 render: uuid => <TokenCreatedByIpAddress uuid={uuid} />
75 name: ApiClientAuthorizationPanelColumnNames.DEFAULT_OWNER_UUID,
78 filters: createTree(),
79 render: uuid => <TokenDefaultOwnerUuid uuid={uuid} />
82 name: ApiClientAuthorizationPanelColumnNames.EXPIRES_AT,
85 filters: createTree(),
86 render: uuid => <TokenExpiresAt uuid={uuid} />
89 name: ApiClientAuthorizationPanelColumnNames.LAST_USED_AT,
92 filters: createTree(),
93 render: uuid => <TokenLastUsedAt uuid={uuid} />
96 name: ApiClientAuthorizationPanelColumnNames.LAST_USED_BY_IP_ADDRESS,
99 filters: createTree(),
100 render: uuid => <TokenLastUsedByIpAddress uuid={uuid} />
103 name: ApiClientAuthorizationPanelColumnNames.SCOPES,
106 filters: createTree(),
107 render: uuid => <TokenScopes uuid={uuid} />
110 name: ApiClientAuthorizationPanelColumnNames.USER_ID,
113 filters: createTree(),
114 render: uuid => <TokenUserId uuid={uuid} />
118 const DEFAULT_MESSAGE = 'Your api client authorization list is empty.';
120 export interface ApiClientAuthorizationPanelRootActionProps {
121 onItemClick: (item: string) => void;
122 onContextMenu: (event: React.MouseEvent<HTMLElement>, item: string) => void;
123 onItemDoubleClick: (item: string) => void;
126 export interface ApiClientAuthorizationPanelRootDataProps {
127 resources: ResourcesState;
130 type ApiClientAuthorizationPanelRootProps = ApiClientAuthorizationPanelRootActionProps
131 & ApiClientAuthorizationPanelRootDataProps & WithStyles<CssRules>;
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}
143 defaultViewIcon={ShareMeIcon}
144 defaultViewMessages={[DEFAULT_MESSAGE]} />