feat(administration): users list implementation

CB-109
This commit is contained in:
Wroud
2020-05-27 19:22:26 +03:00
parent 2ce7093d2a
commit a0b58b60c3
19 changed files with 714 additions and 421 deletions
@@ -47,6 +47,7 @@ const administrationStyles = composes(
display: flex;
flex-direction: row;
flex: 1;
overflow: hidden;
}
drawer {
width: 250px;
@@ -68,11 +69,10 @@ type Props = {
export const Administration = observer(function Administration({ activeItem, onItemSelect }: Props) {
const controller = useController(AdministrationController);
const activeItemName = activeItem || controller.defaultItem;
return styled(useStyles(verticalTabStyles, administrationStyles, tabsStyles))(
<container as='div'>
<TabsState currentTabId={activeItemName} orientation='vertical'>
<TabsState currentTabId={activeItem} orientation='vertical'>
<drawer as='div'>
<TabList aria-label="Administration items">
{controller.items.map(item => (
@@ -81,7 +81,7 @@ export const Administration = observer(function Administration({ activeItem, onI
</TabList>
</drawer>
<content as='div'>
<ItemContent activeItemName={activeItemName}/>
<ItemContent activeItemName={activeItem}/>
</content>
</TabsState>
</container>
@@ -21,10 +21,6 @@ export class AdministrationController {
.sort((a, b) => a.order - b.order);
}
@computed get defaultItem() {
return this.administrationItemService.getDefaultItem();
}
constructor(
private administrationItemService: AdministrationItemService
) {}
@@ -26,7 +26,7 @@ export class AdministrationScreenService extends Bootstrap {
if (!this.screenService.isActive(AdministrationScreenService.screenName)) {
return null;
}
return this.routerService.params.item || null;
return this.routerService.params.item || this.administrationItemService.getDefaultItem();
}
constructor(
@@ -10,11 +10,13 @@ import { observer } from 'mobx-react';
import styled, { css } from 'reshadow';
import { AdministrationTools } from '@dbeaver/administration';
import {
Table, TableHeader, TableColumnHeader, TableBody, TableItem, TableColumnValue
} from '@dbeaver/core/blocks';
import { Loader, IconButton } from '@dbeaver/core/blocks';
import { useService } from '@dbeaver/core/di';
import { useStyles, composes } from '@dbeaver/core/theming';
import { UsersManagerService } from '../UsersManagerService';
import { UsersTable } from './UsersTable/UsersTable';
const styles = composes(
css`
AdministrationTools {
@@ -23,58 +25,39 @@ const styles = composes(
`,
css`
content {
position: relative;
padding-top: 16px;
flex: 1;
overflow: auto;
}
TableColumnHeader {
border-top: solid 1px;
}
AdministrationTools {
display: flex;
padding: 0 16px;
align-items: center;
}
IconButton {
height: 32px;
width: 32px;
margin-right: 16px;
}
`
);
export const UsersAdministration = observer(function UsersAdministration() {
const usersManagerService = useService(UsersManagerService);
return styled(useStyles(styles))(
<>
<AdministrationTools></AdministrationTools>
<AdministrationTools>
<IconButton name="add" viewBox="0 0 28 28" />
<IconButton name="trash" viewBox="0 0 28 28" />
</AdministrationTools>
<content as='div'>
<Table>
<TableHeader>
<TableColumnHeader>User login</TableColumnHeader>
<TableColumnHeader>User first name</TableColumnHeader>
<TableColumnHeader>User last name</TableColumnHeader>
<TableColumnHeader>User last name</TableColumnHeader>
<TableColumnHeader></TableColumnHeader>
</TableHeader>
<TableBody>
<TableItem item={0}>
<TableColumnValue>a</TableColumnValue>
<TableColumnValue>b</TableColumnValue>
<TableColumnValue>c</TableColumnValue>
<TableColumnValue>d</TableColumnValue>
<TableColumnValue></TableColumnValue>
</TableItem>
<TableItem item={1}>
<TableColumnValue>a</TableColumnValue>
<TableColumnValue>b</TableColumnValue>
<TableColumnValue>c</TableColumnValue>
<TableColumnValue>d</TableColumnValue>
<TableColumnValue></TableColumnValue>
</TableItem>
<TableItem item={2}>
<TableColumnValue>a</TableColumnValue>
<TableColumnValue>b</TableColumnValue>
<TableColumnValue>c</TableColumnValue>
<TableColumnValue>d</TableColumnValue>
<TableColumnValue></TableColumnValue>
</TableItem>
<TableItem item={3}>
<TableColumnValue>a</TableColumnValue>
<TableColumnValue>b</TableColumnValue>
<TableColumnValue>c</TableColumnValue>
<TableColumnValue>d</TableColumnValue>
<TableColumnValue></TableColumnValue>
</TableItem>
</TableBody>
</Table>
<UsersTable users={usersManagerService.users.data}/>
{usersManagerService.users.isLoading() && <Loader overlay/>}
</content>
</>
);
@@ -9,13 +9,15 @@
import { AdministrationItemService } from '@dbeaver/administration';
import { injectable, Bootstrap } from '@dbeaver/core/di';
import { UsersManagerService } from '../UsersManagerService';
import { UsersAdministration } from './UsersAdministration';
import { UsersDrawerItem } from './UsersDrawerItem';
@injectable()
export class AuthUsersAdministrationService extends Bootstrap {
export class UsersAdministrationService extends Bootstrap {
constructor(
private administrationItemService: AdministrationItemService
private administrationItemService: AdministrationItemService,
private usersManagerService: UsersManagerService,
) {
super();
}
@@ -25,6 +27,11 @@ export class AuthUsersAdministrationService extends Bootstrap {
name: 'users',
getContentComponent: () => UsersAdministration,
getDrawerComponent: () => UsersDrawerItem,
onActivate: this.loadUsers.bind(this),
});
}
private async loadUsers() {
await this.usersManagerService.users.load();
}
}
@@ -0,0 +1,29 @@
/*
* cloudbeaver - Cloud Database Manager
* Copyright (C) 2020 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { observer } from 'mobx-react';
import styled from 'reshadow';
import {
TableItem, TableColumnValue
} from '@dbeaver/core/blocks';
import { AdminUserInfo } from '@dbeaver/core/sdk';
import { useStyles } from '@dbeaver/core/theming';
type Props = {
user: AdminUserInfo;
}
export const User = observer(function User({ user }: Props) {
return styled(useStyles())(
<TableItem item={user.userId}>
<TableColumnValue>{user.userId}</TableColumnValue>
<TableColumnValue></TableColumnValue>
</TableItem>
);
});
@@ -0,0 +1,45 @@
/*
* cloudbeaver - Cloud Database Manager
* Copyright (C) 2020 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { observer } from 'mobx-react';
import styled, { css } from 'reshadow';
import {
Table, TableHeader, TableColumnHeader, TableBody
} from '@dbeaver/core/blocks';
import { AdminUserInfo } from '@dbeaver/core/sdk';
import { useStyles, composes } from '@dbeaver/core/theming';
import { User } from './User';
const styles = composes(
css``,
css`
TableColumnHeader {
border-top: solid 1px;
}
`
);
type Props = {
users: AdminUserInfo[];
}
export const UsersTable = observer(function UsersTable({ users }: Props) {
return styled(useStyles(styles))(
<Table>
<TableHeader>
<TableColumnHeader>User login</TableColumnHeader>
<TableColumnHeader></TableColumnHeader>
</TableHeader>
<TableBody>
{users.map(user => <User key={user.userId} user={user}/>)}
</TableBody>
</Table>
);
});
@@ -0,0 +1,26 @@
/*
* cloudbeaver - Cloud Database Manager
* Copyright (C) 2020 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { injectable } from '@dbeaver/core/di';
import { CachedResource, GraphQLService, AdminUserInfo } from '@dbeaver/core/sdk';
@injectable()
export class UsersManagerService {
readonly users = new CachedResource([], this.refreshAsync.bind(this), data => !!data.length)
constructor(
private graphQLService: GraphQLService
) {
}
private async refreshAsync(data: AdminUserInfo[]): Promise<AdminUserInfo[]> {
const { users } = await this.graphQLService.gql.getUsersList();
// TODO: temporary before full implementation was provided
return users as AdminUserInfo[];
}
}
@@ -8,7 +8,8 @@
import { IServiceInjector, PluginManifest } from '@dbeaver/core/di';
import { AuthUsersAdministrationService } from './Administration/Users/AuthUsersAdministrationService';
import { UsersAdministrationService } from './Administration/Users/UsersAdministrationService';
import { UsersManagerService } from './Administration/UsersManagerService';
import { AuthenticationService } from './AuthenticationService';
import { AuthInfoService } from './AuthInfoService';
import { AuthMenuService } from './AuthMenuService';
@@ -27,7 +28,8 @@ export const manifest: PluginManifest = {
AuthProviderService,
AuthDialogService,
AuthMenuService,
AuthUsersAdministrationService,
UsersAdministrationService,
UsersManagerService,
],
async initialize(services: IServiceInjector) {
+1
View File
@@ -5,6 +5,7 @@ schema:
- ../../../server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls
- ../../../server/bundles/io.cloudbeaver.service.metadata/schema/service.metadata.graphqls
- ../../../server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls
- ../../../server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
- ../../../server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
documents:
- ./src/**/*.gql
@@ -57,6 +57,22 @@
</g>
</symbol>
<symbol id="add" width="28" height="28" viewBox="0 0 28 28">
<g fill="none" fill-rule="evenodd">
<path d="M0 0L36 0 36 36 0 36z" transform="translate(-4 -4)"/>
<path fill-rule="nonzero" stroke="currentColor" stroke-width="2" d="M28.5 5.5h-21c-1.107 0-2 .896-2 2v21c0 1.104.893 2 2 2h21c1.107 0 2-.896 2-2v-21c0-1.104-.893-2-2-2z" transform="translate(-4 -4)"/>
<path fill="currentColor" fill-rule="nonzero" d="M22.297 12.293L18 16.59 13.703 12.293 12.293 13.703 16.59 18 12.293 22.297 13.703 23.707 18 19.41 22.297 23.707 23.707 22.297 19.41 18 23.707 13.703z" transform="translate(-4 -4) rotate(-45 18 18)"/>
</g>
</symbol>
<symbol id="trash" width="28" height="28" viewBox="0 0 28 28">
<g fill="none" fill-rule="evenodd">
<path d="M0 0L36 0 36 36 0 36z" transform="translate(-4 -4)"/>
<path fill-rule="nonzero" stroke="currentColor" stroke-width="2" d="M28.5 5.5h-21c-1.107 0-2 .896-2 2v21c0 1.104.893 2 2 2h21c1.107 0 2-.896 2-2v-21c0-1.104-.893-2-2-2z" transform="translate(-4 -4)"/>
<path fill="currentColor" fill-rule="nonzero" d="M12 25.071v-12h12v12c0 1.1-.9 2-2 2h-8c-1.1 0-2-.9-2-2zm2-10v10h8v-10h-8zm7.5-5H25v2H11v-2h3.5l1-1h5l1 1z" transform="translate(-4 -4)"/>
</g>
</symbol>
<symbol id="angle" viewBox="0 0 15 8">
<path class="icon-fill" fill-rule="evenodd" d="M14.5.954l-.875-.88L7.5 6.238 1.375 0 .5.88 7.5 8z"/>
</symbol>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

@@ -96,5 +96,8 @@ export const SNACKBAR_STYLES = composes(
}
}
}
IconButton {
color: rgba(0, 0, 0, 0.45);
}
`
);
@@ -5,7 +5,7 @@ import { Icon } from './Icons/Icon';
const styles = css`
Button {
color: rgba(0, 0, 0, 0.45);
color: inherit;
outline: none;
border: none;
background: none;
@@ -13,10 +13,11 @@ const styles = css`
padding: 0;
margin: 4px;
height: 16px;
width: 16px;
& Icon {
width: 16px;
height: 16px;
width: 100%;
height: 100%;
}
}
`;
@@ -1,3 +1,3 @@
query deleteUser {
deleteUser
query deleteUser($userId: ID!) {
deleteUser(userId: $userId)
}
@@ -1,4 +1,4 @@
query getRolesList($roleId: ID) {
query getPermissionsList($roleId: ID) {
permissions: listPermissions {
id
label
@@ -1,9 +1,9 @@
query getUsersList($userId: ID) {
users: authLogin(userId: $userId) {
users: listUsers(userId: $userId) {
userId
metaParameters
configurationParameters
grantedRoles
#metaParameters
#configurationParameters
#grantedRoles
}
}
@@ -0,0 +1,3 @@
query setUserCredentials($userId: ID!, $providerId: ID!, $credentials: Object!) {
setUserCredentials(userId: $userId, providerId: $providerId, credentials: $credentials)
}
+533 -355
View File
@@ -14,122 +14,189 @@ export type Scalars = {
DateTime: any;
};
export type Query = {
authLogin: UserAuthInfo;
authLogout?: Maybe<Scalars['Boolean']>;
authProviders: Array<AuthProviderInfo>;
connectionState: ConnectionInfo;
dataSourceList: Array<DataSourceInfo>;
dataTransferAvailableStreamProcessors: Array<DataTransferProcessorInfo>;
dataTransferExportDataFromContainer: AsyncTaskInfo;
dataTransferExportDataFromResults: AsyncTaskInfo;
dataTransferRemoveDataFile?: Maybe<Scalars['Boolean']>;
driverList: Array<DriverInfo>;
metadataGetNodeDDL?: Maybe<Scalars['String']>;
navGetStructContainers: DatabaseStructContainers;
navNodeChildren: Array<NavigatorNodeInfo>;
navNodeInfo: NavigatorNodeInfo;
navRefreshNode?: Maybe<Scalars['Boolean']>;
readSessionLog: Array<LogEntry>;
serverConfig: ServerConfig;
sessionPermissions: Array<Maybe<Scalars['ID']>>;
sessionState: SessionInfo;
sessionUser?: Maybe<UserAuthInfo>;
sqlCompletionProposals?: Maybe<Array<Maybe<SqlCompletionProposal>>>;
sqlDialectInfo?: Maybe<SqlDialectInfo>;
sqlListContexts?: Maybe<Array<Maybe<SqlContextInfo>>>;
};
export type QueryAuthLoginArgs = {
provider: Scalars['ID'];
credentials: Scalars['Object'];
};
export type QueryConnectionStateArgs = {
export type AdminPermissionInfo = {
id: Scalars['ID'];
label?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
provider: Scalars['String'];
category?: Maybe<Scalars['String']>;
};
export type AdminRoleInfo = {
roleId: Scalars['ID'];
roleName?: Maybe<Scalars['String']>;
rolePermissions: Array<Maybe<Scalars['ID']>>;
};
export type AdminUserInfo = {
userId: Scalars['ID'];
metaParameters: Scalars['Object'];
configurationParameters: Scalars['Object'];
grantedRoles: Array<Maybe<Scalars['ID']>>;
};
export type AsyncTaskInfo = {
id: Scalars['String'];
name?: Maybe<Scalars['String']>;
running: Scalars['Boolean'];
status?: Maybe<Scalars['String']>;
error?: Maybe<ServerError>;
result?: Maybe<SqlExecuteInfo>;
taskResult?: Maybe<Scalars['Object']>;
};
export enum AuthCredentialEncryption {
None = 'none',
Plain = 'plain',
Hash = 'hash'
}
export type AuthCredentialInfo = {
id: Scalars['ID'];
displayName: Scalars['String'];
description?: Maybe<Scalars['String']>;
admin?: Maybe<Scalars['Boolean']>;
user?: Maybe<Scalars['Boolean']>;
possibleValues?: Maybe<Array<Maybe<Scalars['String']>>>;
encryption?: Maybe<AuthCredentialEncryption>;
};
export type AuthProviderInfo = {
id: Scalars['ID'];
label: Scalars['String'];
icon?: Maybe<Scalars['ID']>;
description?: Maybe<Scalars['String']>;
defaultProvider?: Maybe<Scalars['Boolean']>;
credentialParameters: Array<AuthCredentialInfo>;
};
export type ConnectionConfig = {
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
dataSourceId?: Maybe<Scalars['ID']>;
driverId?: Maybe<Scalars['ID']>;
host?: Maybe<Scalars['String']>;
port?: Maybe<Scalars['String']>;
databaseName?: Maybe<Scalars['String']>;
url?: Maybe<Scalars['String']>;
properties?: Maybe<Scalars['Object']>;
userName?: Maybe<Scalars['String']>;
userPassword?: Maybe<Scalars['String']>;
};
export type ConnectionInfo = {
id: Scalars['ID'];
driverId: Scalars['ID'];
name: Scalars['String'];
description?: Maybe<Scalars['String']>;
properties?: Maybe<Scalars['String']>;
connected: Scalars['Boolean'];
provided: Scalars['Boolean'];
connectTime?: Maybe<Scalars['String']>;
connectionError?: Maybe<ServerError>;
serverVersion?: Maybe<Scalars['String']>;
clientVersion?: Maybe<Scalars['String']>;
features: Array<Scalars['String']>;
};
export type DatabaseObjectInfo = {
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
type?: Maybe<Scalars['String']>;
properties?: Maybe<Array<Maybe<ObjectPropertyInfo>>>;
ordinalPosition?: Maybe<Scalars['Int']>;
fullyQualifiedName?: Maybe<Scalars['String']>;
overloadedName?: Maybe<Scalars['String']>;
uniqueName?: Maybe<Scalars['String']>;
state?: Maybe<Scalars['String']>;
features?: Maybe<Array<Maybe<Scalars['String']>>>;
editors?: Maybe<Array<Maybe<Scalars['String']>>>;
};
export type QueryDataTransferExportDataFromContainerArgs = {
connectionId: Scalars['ID'];
containerNodePath: Scalars['ID'];
parameters: DataTransferParameters;
export type DatabaseObjectInfoPropertiesArgs = {
filter?: Maybe<ObjectPropertyFilter>;
};
export type DatabaseStructContainers = {
catalogList: Array<DatabaseObjectInfo>;
schemaList: Array<DatabaseObjectInfo>;
};
export type DataSourceInfo = {
id: Scalars['ID'];
driverId: Scalars['ID'];
name: Scalars['String'];
description?: Maybe<Scalars['String']>;
host?: Maybe<Scalars['String']>;
server?: Maybe<Scalars['String']>;
port?: Maybe<Scalars['String']>;
url?: Maybe<Scalars['String']>;
properties?: Maybe<Scalars['String']>;
};
export type DataTransferParameters = {
processorId: Scalars['ID'];
settings?: Maybe<Scalars['Object']>;
processorProperties: Scalars['Object'];
filter?: Maybe<SqlDataFilter>;
};
export type DataTransferProcessorInfo = {
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
fileExtension?: Maybe<Scalars['String']>;
appFileExtension?: Maybe<Scalars['String']>;
appName?: Maybe<Scalars['String']>;
order: Scalars['Int'];
icon?: Maybe<Scalars['String']>;
properties?: Maybe<Array<Maybe<ObjectPropertyInfo>>>;
isBinary?: Maybe<Scalars['Boolean']>;
isHTML?: Maybe<Scalars['Boolean']>;
};
export type QueryDataTransferExportDataFromResultsArgs = {
connectionId: Scalars['ID'];
contextId: Scalars['ID'];
resultsId: Scalars['ID'];
parameters: DataTransferParameters;
export type DriverInfo = {
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
icon?: Maybe<Scalars['String']>;
iconBig?: Maybe<Scalars['String']>;
providerId?: Maybe<Scalars['ID']>;
driverClassName?: Maybe<Scalars['String']>;
defaultPort?: Maybe<Scalars['String']>;
sampleURL?: Maybe<Scalars['String']>;
driverInfoURL?: Maybe<Scalars['String']>;
driverPropertiesURL?: Maybe<Scalars['String']>;
embedded?: Maybe<Scalars['Boolean']>;
anonymousAccess?: Maybe<Scalars['Boolean']>;
allowsEmptyPassword?: Maybe<Scalars['Boolean']>;
licenseRequired?: Maybe<Scalars['Boolean']>;
license?: Maybe<Scalars['String']>;
custom?: Maybe<Scalars['Boolean']>;
promotedScore?: Maybe<Scalars['Int']>;
connectionProperties?: Maybe<Scalars['Object']>;
defaultConnectionProperties?: Maybe<Scalars['Object']>;
driverProperties?: Maybe<Array<Maybe<DriverPropertyInfo>>>;
driverParameters?: Maybe<Scalars['Object']>;
};
export type QueryDataTransferRemoveDataFileArgs = {
dataFileId: Scalars['String'];
export type DriverPropertyInfo = {
id: Scalars['ID'];
displayName?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
category?: Maybe<Scalars['String']>;
dataType?: Maybe<Scalars['String']>;
defaultValue?: Maybe<Scalars['Object']>;
validValues?: Maybe<Array<Maybe<Scalars['Object']>>>;
};
export type QueryDriverListArgs = {
id?: Maybe<Scalars['ID']>;
};
export type QueryMetadataGetNodeDdlArgs = {
nodeId: Scalars['ID'];
options?: Maybe<Scalars['Object']>;
};
export type QueryNavGetStructContainersArgs = {
connectionId: Scalars['ID'];
catalog?: Maybe<Scalars['ID']>;
};
export type QueryNavNodeChildrenArgs = {
parentPath: Scalars['ID'];
offset?: Maybe<Scalars['Int']>;
limit?: Maybe<Scalars['Int']>;
onlyFolders?: Maybe<Scalars['Boolean']>;
};
export type QueryNavNodeInfoArgs = {
nodePath: Scalars['ID'];
};
export type QueryNavRefreshNodeArgs = {
nodePath: Scalars['ID'];
};
export type QueryReadSessionLogArgs = {
maxEntries?: Maybe<Scalars['Int']>;
clearEntries?: Maybe<Scalars['Boolean']>;
};
export type QuerySqlCompletionProposalsArgs = {
connectionId: Scalars['ID'];
contextId: Scalars['ID'];
query: Scalars['String'];
position: Scalars['Int'];
maxResults?: Maybe<Scalars['Int']>;
};
export type QuerySqlDialectInfoArgs = {
connectionId: Scalars['ID'];
};
export type QuerySqlListContextsArgs = {
connectionId: Scalars['ID'];
export type LogEntry = {
time?: Maybe<Scalars['DateTime']>;
type: Scalars['String'];
message?: Maybe<Scalars['String']>;
stackTrace?: Maybe<Scalars['String']>;
};
export type Mutation = {
@@ -249,39 +316,230 @@ export type MutationUpdateResultsDataArgs = {
updateValues?: Maybe<Scalars['Object']>;
};
export type AsyncTaskInfo = {
id: Scalars['String'];
export type NavigatorNodeInfo = {
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
running: Scalars['Boolean'];
status?: Maybe<Scalars['String']>;
error?: Maybe<ServerError>;
result?: Maybe<SqlExecuteInfo>;
taskResult?: Maybe<Scalars['Object']>;
icon?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
nodeType?: Maybe<Scalars['String']>;
hasChildren?: Maybe<Scalars['Boolean']>;
object?: Maybe<DatabaseObjectInfo>;
features?: Maybe<Array<Maybe<Scalars['String']>>>;
folder?: Maybe<Scalars['Boolean']>;
inline?: Maybe<Scalars['Boolean']>;
navigable?: Maybe<Scalars['Boolean']>;
};
export type ServerError = {
message?: Maybe<Scalars['String']>;
errorCode?: Maybe<Scalars['String']>;
stackTrace?: Maybe<Scalars['String']>;
causedBy?: Maybe<ServerError>;
};
export type ServerMessage = {
time?: Maybe<Scalars['String']>;
message?: Maybe<Scalars['String']>;
};
export type ServerLanguage = {
isoCode: Scalars['String'];
export type ObjectDescriptor = {
id?: Maybe<Scalars['Int']>;
displayName?: Maybe<Scalars['String']>;
nativeName?: Maybe<Scalars['String']>;
fullName?: Maybe<Scalars['String']>;
uniqueName?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
value?: Maybe<Scalars['String']>;
};
export type WebServiceConfig = {
id: Scalars['String'];
name: Scalars['String'];
description: Scalars['String'];
bundleVersion: Scalars['String'];
export type ObjectPropertyFilter = {
ids?: Maybe<Array<Maybe<Scalars['String']>>>;
features?: Maybe<Array<Maybe<Scalars['String']>>>;
categories?: Maybe<Array<Maybe<Scalars['String']>>>;
dataTypes?: Maybe<Array<Maybe<Scalars['String']>>>;
};
export type ObjectPropertyInfo = {
id?: Maybe<Scalars['String']>;
displayName?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
category?: Maybe<Scalars['String']>;
dataType?: Maybe<Scalars['String']>;
value?: Maybe<Scalars['Object']>;
validValues?: Maybe<Array<Maybe<Scalars['Object']>>>;
defaultValue?: Maybe<Scalars['Object']>;
features: Array<Scalars['String']>;
};
export type Query = {
authLogin: UserAuthInfo;
authLogout?: Maybe<Scalars['Boolean']>;
authProviders: Array<AuthProviderInfo>;
connectionState: ConnectionInfo;
createRole: AdminRoleInfo;
createUser: AdminUserInfo;
dataSourceList: Array<DataSourceInfo>;
dataTransferAvailableStreamProcessors: Array<DataTransferProcessorInfo>;
dataTransferExportDataFromContainer: AsyncTaskInfo;
dataTransferExportDataFromResults: AsyncTaskInfo;
dataTransferRemoveDataFile?: Maybe<Scalars['Boolean']>;
deleteRole?: Maybe<Scalars['Boolean']>;
deleteUser?: Maybe<Scalars['Boolean']>;
driverList: Array<DriverInfo>;
grantUserRole?: Maybe<Scalars['Boolean']>;
listPermissions: Array<Maybe<AdminPermissionInfo>>;
listRoles: Array<Maybe<AdminRoleInfo>>;
listUsers: Array<Maybe<AdminUserInfo>>;
metadataGetNodeDDL?: Maybe<Scalars['String']>;
navGetStructContainers: DatabaseStructContainers;
navNodeChildren: Array<NavigatorNodeInfo>;
navNodeInfo: NavigatorNodeInfo;
navRefreshNode?: Maybe<Scalars['Boolean']>;
readSessionLog: Array<LogEntry>;
revokeUserRole?: Maybe<Scalars['Boolean']>;
serverConfig: ServerConfig;
sessionPermissions: Array<Maybe<Scalars['ID']>>;
sessionState: SessionInfo;
sessionUser?: Maybe<UserAuthInfo>;
setRolePermissions?: Maybe<Scalars['Boolean']>;
setUserCredentials?: Maybe<Scalars['Boolean']>;
sqlCompletionProposals?: Maybe<Array<Maybe<SqlCompletionProposal>>>;
sqlDialectInfo?: Maybe<SqlDialectInfo>;
sqlListContexts?: Maybe<Array<Maybe<SqlContextInfo>>>;
};
export type QueryAuthLoginArgs = {
provider: Scalars['ID'];
credentials: Scalars['Object'];
};
export type QueryConnectionStateArgs = {
id: Scalars['ID'];
};
export type QueryCreateRoleArgs = {
roleId: Scalars['ID'];
};
export type QueryCreateUserArgs = {
userId: Scalars['ID'];
};
export type QueryDataTransferExportDataFromContainerArgs = {
connectionId: Scalars['ID'];
containerNodePath: Scalars['ID'];
parameters: DataTransferParameters;
};
export type QueryDataTransferExportDataFromResultsArgs = {
connectionId: Scalars['ID'];
contextId: Scalars['ID'];
resultsId: Scalars['ID'];
parameters: DataTransferParameters;
};
export type QueryDataTransferRemoveDataFileArgs = {
dataFileId: Scalars['String'];
};
export type QueryDeleteRoleArgs = {
roleId: Scalars['ID'];
};
export type QueryDeleteUserArgs = {
userId: Scalars['ID'];
};
export type QueryDriverListArgs = {
id?: Maybe<Scalars['ID']>;
};
export type QueryGrantUserRoleArgs = {
userId: Scalars['ID'];
roleId: Scalars['ID'];
};
export type QueryListRolesArgs = {
roleId?: Maybe<Scalars['ID']>;
};
export type QueryListUsersArgs = {
userId?: Maybe<Scalars['ID']>;
};
export type QueryMetadataGetNodeDdlArgs = {
nodeId: Scalars['ID'];
options?: Maybe<Scalars['Object']>;
};
export type QueryNavGetStructContainersArgs = {
connectionId: Scalars['ID'];
catalog?: Maybe<Scalars['ID']>;
};
export type QueryNavNodeChildrenArgs = {
parentPath: Scalars['ID'];
offset?: Maybe<Scalars['Int']>;
limit?: Maybe<Scalars['Int']>;
onlyFolders?: Maybe<Scalars['Boolean']>;
};
export type QueryNavNodeInfoArgs = {
nodePath: Scalars['ID'];
};
export type QueryNavRefreshNodeArgs = {
nodePath: Scalars['ID'];
};
export type QueryReadSessionLogArgs = {
maxEntries?: Maybe<Scalars['Int']>;
clearEntries?: Maybe<Scalars['Boolean']>;
};
export type QueryRevokeUserRoleArgs = {
userId: Scalars['ID'];
roleId: Scalars['ID'];
};
export type QuerySetRolePermissionsArgs = {
roleId: Scalars['ID'];
permissions: Array<Maybe<Scalars['ID']>>;
};
export type QuerySetUserCredentialsArgs = {
userId: Scalars['ID'];
providerId: Scalars['ID'];
credentials: Scalars['Object'];
};
export type QuerySqlCompletionProposalsArgs = {
connectionId: Scalars['ID'];
contextId: Scalars['ID'];
query: Scalars['String'];
position: Scalars['Int'];
maxResults?: Maybe<Scalars['Int']>;
};
export type QuerySqlDialectInfoArgs = {
connectionId: Scalars['ID'];
};
export type QuerySqlListContextsArgs = {
connectionId: Scalars['ID'];
};
export type ServerConfig = {
@@ -299,6 +557,24 @@ export type ServerConfig = {
productConfiguration: Scalars['Object'];
};
export type ServerError = {
message?: Maybe<Scalars['String']>;
errorCode?: Maybe<Scalars['String']>;
stackTrace?: Maybe<Scalars['String']>;
causedBy?: Maybe<ServerError>;
};
export type ServerLanguage = {
isoCode: Scalars['String'];
displayName?: Maybe<Scalars['String']>;
nativeName?: Maybe<Scalars['String']>;
};
export type ServerMessage = {
time?: Maybe<Scalars['String']>;
message?: Maybe<Scalars['String']>;
};
export type SessionInfo = {
createTime: Scalars['String'];
lastAccessTime: Scalars['String'];
@@ -308,168 +584,6 @@ export type SessionInfo = {
connections: Array<ConnectionInfo>;
};
export type DriverInfo = {
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
icon?: Maybe<Scalars['String']>;
iconBig?: Maybe<Scalars['String']>;
providerId?: Maybe<Scalars['ID']>;
driverClassName?: Maybe<Scalars['String']>;
defaultPort?: Maybe<Scalars['String']>;
sampleURL?: Maybe<Scalars['String']>;
driverInfoURL?: Maybe<Scalars['String']>;
driverPropertiesURL?: Maybe<Scalars['String']>;
embedded?: Maybe<Scalars['Boolean']>;
anonymousAccess?: Maybe<Scalars['Boolean']>;
allowsEmptyPassword?: Maybe<Scalars['Boolean']>;
licenseRequired?: Maybe<Scalars['Boolean']>;
license?: Maybe<Scalars['String']>;
custom?: Maybe<Scalars['Boolean']>;
promotedScore?: Maybe<Scalars['Int']>;
connectionProperties?: Maybe<Scalars['Object']>;
defaultConnectionProperties?: Maybe<Scalars['Object']>;
driverProperties?: Maybe<Array<Maybe<DriverPropertyInfo>>>;
driverParameters?: Maybe<Scalars['Object']>;
};
export type DriverPropertyInfo = {
id: Scalars['ID'];
displayName?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
category?: Maybe<Scalars['String']>;
dataType?: Maybe<Scalars['String']>;
defaultValue?: Maybe<Scalars['Object']>;
validValues?: Maybe<Array<Maybe<Scalars['Object']>>>;
};
export type DataSourceInfo = {
id: Scalars['ID'];
driverId: Scalars['ID'];
name: Scalars['String'];
description?: Maybe<Scalars['String']>;
host?: Maybe<Scalars['String']>;
server?: Maybe<Scalars['String']>;
port?: Maybe<Scalars['String']>;
url?: Maybe<Scalars['String']>;
properties?: Maybe<Scalars['String']>;
};
export type ConnectionConfig = {
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
dataSourceId?: Maybe<Scalars['ID']>;
driverId?: Maybe<Scalars['ID']>;
host?: Maybe<Scalars['String']>;
port?: Maybe<Scalars['String']>;
databaseName?: Maybe<Scalars['String']>;
url?: Maybe<Scalars['String']>;
properties?: Maybe<Scalars['Object']>;
userName?: Maybe<Scalars['String']>;
userPassword?: Maybe<Scalars['String']>;
};
export type ConnectionInfo = {
id: Scalars['ID'];
driverId: Scalars['ID'];
name: Scalars['String'];
description?: Maybe<Scalars['String']>;
properties?: Maybe<Scalars['String']>;
connected: Scalars['Boolean'];
provided: Scalars['Boolean'];
connectTime?: Maybe<Scalars['String']>;
connectionError?: Maybe<ServerError>;
serverVersion?: Maybe<Scalars['String']>;
clientVersion?: Maybe<Scalars['String']>;
features: Array<Scalars['String']>;
};
export type LogEntry = {
time?: Maybe<Scalars['DateTime']>;
type: Scalars['String'];
message?: Maybe<Scalars['String']>;
stackTrace?: Maybe<Scalars['String']>;
};
export type ObjectDescriptor = {
id?: Maybe<Scalars['Int']>;
displayName?: Maybe<Scalars['String']>;
fullName?: Maybe<Scalars['String']>;
uniqueName?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
value?: Maybe<Scalars['String']>;
};
export type ObjectPropertyInfo = {
id?: Maybe<Scalars['String']>;
displayName?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
category?: Maybe<Scalars['String']>;
dataType?: Maybe<Scalars['String']>;
value?: Maybe<Scalars['Object']>;
validValues?: Maybe<Array<Maybe<Scalars['Object']>>>;
defaultValue?: Maybe<Scalars['Object']>;
features: Array<Scalars['String']>;
};
export type ObjectPropertyFilter = {
ids?: Maybe<Array<Maybe<Scalars['String']>>>;
features?: Maybe<Array<Maybe<Scalars['String']>>>;
categories?: Maybe<Array<Maybe<Scalars['String']>>>;
dataTypes?: Maybe<Array<Maybe<Scalars['String']>>>;
};
export type DatabaseObjectInfo = {
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
type?: Maybe<Scalars['String']>;
properties?: Maybe<Array<Maybe<ObjectPropertyInfo>>>;
ordinalPosition?: Maybe<Scalars['Int']>;
fullyQualifiedName?: Maybe<Scalars['String']>;
overloadedName?: Maybe<Scalars['String']>;
uniqueName?: Maybe<Scalars['String']>;
state?: Maybe<Scalars['String']>;
features?: Maybe<Array<Maybe<Scalars['String']>>>;
editors?: Maybe<Array<Maybe<Scalars['String']>>>;
};
export type DatabaseObjectInfoPropertiesArgs = {
filter?: Maybe<ObjectPropertyFilter>;
};
export type NavigatorNodeInfo = {
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
icon?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
nodeType?: Maybe<Scalars['String']>;
hasChildren?: Maybe<Scalars['Boolean']>;
object?: Maybe<DatabaseObjectInfo>;
features?: Maybe<Array<Maybe<Scalars['String']>>>;
folder?: Maybe<Scalars['Boolean']>;
inline?: Maybe<Scalars['Boolean']>;
navigable?: Maybe<Scalars['Boolean']>;
};
export type DatabaseStructContainers = {
catalogList: Array<DatabaseObjectInfo>;
schemaList: Array<DatabaseObjectInfo>;
};
export type SqlDialectInfo = {
name?: Maybe<Scalars['String']>;
dataTypes?: Maybe<Array<Maybe<Scalars['String']>>>;
functions?: Maybe<Array<Maybe<Scalars['String']>>>;
reservedWords?: Maybe<Array<Maybe<Scalars['String']>>>;
quoteStrings?: Maybe<Array<Maybe<Array<Maybe<Scalars['String']>>>>>;
singleLineComments?: Maybe<Array<Maybe<Scalars['String']>>>;
multiLineComments?: Maybe<Array<Maybe<Array<Maybe<Scalars['String']>>>>>;
catalogSeparator?: Maybe<Scalars['String']>;
structSeparator?: Maybe<Scalars['String']>;
scriptDelimiter?: Maybe<Scalars['String']>;
};
export type SqlCompletionProposal = {
displayString?: Maybe<Scalars['String']>;
type?: Maybe<Scalars['String']>;
@@ -488,6 +602,14 @@ export type SqlContextInfo = {
defaultSchema?: Maybe<Scalars['String']>;
};
export type SqlDataFilter = {
offset?: Maybe<Scalars['Int']>;
limit?: Maybe<Scalars['Int']>;
constraints?: Maybe<Array<Maybe<SqlDataFilterConstraint>>>;
where?: Maybe<Scalars['String']>;
orderBy?: Maybe<Scalars['String']>;
};
export type SqlDataFilterConstraint = {
attribute: Scalars['String'];
orderPosition?: Maybe<Scalars['Int']>;
@@ -497,11 +619,30 @@ export type SqlDataFilterConstraint = {
value?: Maybe<Scalars['Object']>;
};
export type SqlDataFilter = {
offset?: Maybe<Scalars['Int']>;
limit?: Maybe<Scalars['Int']>;
constraints?: Maybe<Array<Maybe<SqlDataFilterConstraint>>>;
where?: Maybe<Scalars['String']>;
export type SqlDialectInfo = {
name?: Maybe<Scalars['String']>;
dataTypes?: Maybe<Array<Maybe<Scalars['String']>>>;
functions?: Maybe<Array<Maybe<Scalars['String']>>>;
reservedWords?: Maybe<Array<Maybe<Scalars['String']>>>;
quoteStrings?: Maybe<Array<Maybe<Array<Maybe<Scalars['String']>>>>>;
singleLineComments?: Maybe<Array<Maybe<Scalars['String']>>>;
multiLineComments?: Maybe<Array<Maybe<Array<Maybe<Scalars['String']>>>>>;
catalogSeparator?: Maybe<Scalars['String']>;
structSeparator?: Maybe<Scalars['String']>;
scriptDelimiter?: Maybe<Scalars['String']>;
};
export type SqlExecuteInfo = {
statusMessage?: Maybe<Scalars['String']>;
duration?: Maybe<Scalars['Int']>;
results: Array<SqlQueryResults>;
};
export type SqlQueryResults = {
title?: Maybe<Scalars['String']>;
updateRowCount?: Maybe<Scalars['Int']>;
sourceQuery?: Maybe<Scalars['String']>;
resultSet?: Maybe<SqlResultSet>;
};
export type SqlResultColumn = {
@@ -525,44 +666,6 @@ export type SqlResultSet = {
hasMoreData?: Maybe<Scalars['Boolean']>;
};
export type SqlQueryResults = {
title?: Maybe<Scalars['String']>;
updateRowCount?: Maybe<Scalars['Int']>;
sourceQuery?: Maybe<Scalars['String']>;
resultSet?: Maybe<SqlResultSet>;
};
export type SqlExecuteInfo = {
statusMessage?: Maybe<Scalars['String']>;
duration?: Maybe<Scalars['Int']>;
results: Array<SqlQueryResults>;
};
export enum AuthCredentialEncryption {
None = 'none',
Plain = 'plain',
Hash = 'hash'
}
export type AuthCredentialInfo = {
id: Scalars['ID'];
displayName: Scalars['String'];
description?: Maybe<Scalars['String']>;
admin?: Maybe<Scalars['Boolean']>;
user?: Maybe<Scalars['Boolean']>;
possibleValues?: Maybe<Array<Maybe<Scalars['String']>>>;
encryption?: Maybe<AuthCredentialEncryption>;
};
export type AuthProviderInfo = {
id: Scalars['ID'];
label: Scalars['String'];
icon?: Maybe<Scalars['ID']>;
description?: Maybe<Scalars['String']>;
defaultProvider?: Maybe<Scalars['Boolean']>;
credentialParameters: Array<AuthCredentialInfo>;
};
export type UserAuthInfo = {
userId: Scalars['String'];
displayName?: Maybe<Scalars['String']>;
@@ -571,25 +674,11 @@ export type UserAuthInfo = {
message?: Maybe<Scalars['String']>;
};
export type DataTransferProcessorInfo = {
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
description?: Maybe<Scalars['String']>;
fileExtension?: Maybe<Scalars['String']>;
appFileExtension?: Maybe<Scalars['String']>;
appName?: Maybe<Scalars['String']>;
order: Scalars['Int'];
icon?: Maybe<Scalars['String']>;
properties?: Maybe<Array<Maybe<ObjectPropertyInfo>>>;
isBinary?: Maybe<Scalars['Boolean']>;
isHTML?: Maybe<Scalars['Boolean']>;
};
export type DataTransferParameters = {
processorId: Scalars['ID'];
settings?: Maybe<Scalars['Object']>;
processorProperties: Scalars['Object'];
filter?: Maybe<SqlDataFilter>;
export type WebServiceConfig = {
id: Scalars['String'];
name: Scalars['String'];
description: Scalars['String'];
bundleVersion: Scalars['String'];
};
export type NavGetStructContainersQueryVariables = {
@@ -725,6 +814,43 @@ export type ChangeSessionLanguageMutationVariables = {
export type ChangeSessionLanguageMutation = Pick<Mutation, 'changeSessionLanguage'>;
export type DeleteUserQueryVariables = {
userId: Scalars['ID'];
};
export type DeleteUserQuery = Pick<Query, 'deleteUser'>;
export type GetPermissionsListQueryVariables = {
roleId?: Maybe<Scalars['ID']>;
};
export type GetPermissionsListQuery = { permissions: Array<Maybe<Pick<AdminPermissionInfo, 'id' | 'label' | 'description' | 'provider' | 'category'>>> };
export type GetRolesListQueryVariables = {
roleId?: Maybe<Scalars['ID']>;
};
export type GetRolesListQuery = { roles: Array<Maybe<Pick<AdminRoleInfo, 'roleId' | 'roleName' | 'rolePermissions'>>> };
export type GetUsersListQueryVariables = {
userId?: Maybe<Scalars['ID']>;
};
export type GetUsersListQuery = { users: Array<Maybe<Pick<AdminUserInfo, 'userId'>>> };
export type SetUserCredentialsQueryVariables = {
userId: Scalars['ID'];
providerId: Scalars['ID'];
credentials: Scalars['Object'];
};
export type SetUserCredentialsQuery = Pick<Query, 'setUserCredentials'>;
export type AuthLoginQueryVariables = {
provider: Scalars['ID'];
credentials: Scalars['Object'];
@@ -1199,6 +1325,43 @@ export const ChangeSessionLanguageDocument = `
changeSessionLanguage(locale: $locale)
}
`;
export const DeleteUserDocument = `
query deleteUser($userId: ID!) {
deleteUser(userId: $userId)
}
`;
export const GetPermissionsListDocument = `
query getPermissionsList($roleId: ID) {
permissions: listPermissions {
id
label
description
provider
category
}
}
`;
export const GetRolesListDocument = `
query getRolesList($roleId: ID) {
roles: listRoles(roleId: $roleId) {
roleId
roleName
rolePermissions
}
}
`;
export const GetUsersListDocument = `
query getUsersList($userId: ID) {
users: listUsers(userId: $userId) {
userId
}
}
`;
export const SetUserCredentialsDocument = `
query setUserCredentials($userId: ID!, $providerId: ID!, $credentials: Object!) {
setUserCredentials(userId: $userId, providerId: $providerId, credentials: $credentials)
}
`;
export const AuthLoginDocument = `
query authLogin($provider: ID!, $credentials: Object!) {
user: authLogin(provider: $provider, credentials: $credentials) {
@@ -1657,6 +1820,21 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper =
changeSessionLanguage(variables: ChangeSessionLanguageMutationVariables): Promise<ChangeSessionLanguageMutation> {
return withWrapper(() => client.request<ChangeSessionLanguageMutation>(ChangeSessionLanguageDocument, variables));
},
deleteUser(variables: DeleteUserQueryVariables): Promise<DeleteUserQuery> {
return withWrapper(() => client.request<DeleteUserQuery>(DeleteUserDocument, variables));
},
getPermissionsList(variables?: GetPermissionsListQueryVariables): Promise<GetPermissionsListQuery> {
return withWrapper(() => client.request<GetPermissionsListQuery>(GetPermissionsListDocument, variables));
},
getRolesList(variables?: GetRolesListQueryVariables): Promise<GetRolesListQuery> {
return withWrapper(() => client.request<GetRolesListQuery>(GetRolesListDocument, variables));
},
getUsersList(variables?: GetUsersListQueryVariables): Promise<GetUsersListQuery> {
return withWrapper(() => client.request<GetUsersListQuery>(GetUsersListDocument, variables));
},
setUserCredentials(variables: SetUserCredentialsQueryVariables): Promise<SetUserCredentialsQuery> {
return withWrapper(() => client.request<SetUserCredentialsQuery>(SetUserCredentialsDocument, variables));
},
authLogin(variables: AuthLoginQueryVariables): Promise<AuthLoginQuery> {
return withWrapper(() => client.request<AuthLoginQuery>(AuthLoginDocument, variables));
},
@@ -34,6 +34,9 @@ const styles = css`
margin: 0;
}
}
IconButton {
color: rgba(0, 0, 0, 0.45);
}
`;
export const ExportNotification = observer(function ExportNotification({