diff --git a/webapp/packages/administration/src/Administration/Administration.tsx b/webapp/packages/administration/src/Administration/Administration.tsx index 27972a0f05..1d931b0abe 100644 --- a/webapp/packages/administration/src/Administration/Administration.tsx +++ b/webapp/packages/administration/src/Administration/Administration.tsx @@ -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))( - + {controller.items.map(item => ( @@ -81,7 +81,7 @@ export const Administration = observer(function Administration({ activeItem, onI - + diff --git a/webapp/packages/administration/src/Administration/AdministrationController.ts b/webapp/packages/administration/src/Administration/AdministrationController.ts index ff762f442b..18fb3bc366 100644 --- a/webapp/packages/administration/src/Administration/AdministrationController.ts +++ b/webapp/packages/administration/src/Administration/AdministrationController.ts @@ -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 ) {} diff --git a/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts b/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts index 23e21071b1..f51b31194e 100644 --- a/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts +++ b/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts @@ -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( diff --git a/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx b/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx index 254dc008b5..d79e3a2bf9 100644 --- a/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx +++ b/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx @@ -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))( <> - + + + + - - - User login - User first name - User last name - User last name - - - - - a - b - c - d - - - - a - b - c - d - - - - a - b - c - d - - - - a - b - c - d - - - -
+ + {usersManagerService.users.isLoading() && }
); diff --git a/webapp/packages/authentication/src/Administration/Users/AuthUsersAdministrationService.ts b/webapp/packages/authentication/src/Administration/Users/UsersAdministrationService.ts similarity index 71% rename from webapp/packages/authentication/src/Administration/Users/AuthUsersAdministrationService.ts rename to webapp/packages/authentication/src/Administration/Users/UsersAdministrationService.ts index 3045a2ab3b..de06d296e1 100644 --- a/webapp/packages/authentication/src/Administration/Users/AuthUsersAdministrationService.ts +++ b/webapp/packages/authentication/src/Administration/Users/UsersAdministrationService.ts @@ -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(); + } } diff --git a/webapp/packages/authentication/src/Administration/Users/UsersTable/User.tsx b/webapp/packages/authentication/src/Administration/Users/UsersTable/User.tsx new file mode 100644 index 0000000000..30fcbcf0b7 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersTable/User.tsx @@ -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())( + + {user.userId} + + + ); +}); diff --git a/webapp/packages/authentication/src/Administration/Users/UsersTable/UsersTable.tsx b/webapp/packages/authentication/src/Administration/Users/UsersTable/UsersTable.tsx new file mode 100644 index 0000000000..964f5be4da --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersTable/UsersTable.tsx @@ -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))( + + + User login + + + + {users.map(user => )} + +
+ ); +}); diff --git a/webapp/packages/authentication/src/Administration/UsersManagerService.ts b/webapp/packages/authentication/src/Administration/UsersManagerService.ts new file mode 100644 index 0000000000..6c1c4fbd55 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/UsersManagerService.ts @@ -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 { + const { users } = await this.graphQLService.gql.getUsersList(); + + // TODO: temporary before full implementation was provided + return users as AdminUserInfo[]; + } +} diff --git a/webapp/packages/authentication/src/manifest.ts b/webapp/packages/authentication/src/manifest.ts index c07c5c5af9..e8bda7e10a 100644 --- a/webapp/packages/authentication/src/manifest.ts +++ b/webapp/packages/authentication/src/manifest.ts @@ -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) { diff --git a/webapp/packages/core/codegen.yml b/webapp/packages/core/codegen.yml index 857ed8b067..c08a189ba9 100644 --- a/webapp/packages/core/codegen.yml +++ b/webapp/packages/core/codegen.yml @@ -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 diff --git a/webapp/packages/core/public/icons/icons.svg b/webapp/packages/core/public/icons/icons.svg index fe06f77d01..c74818691f 100644 --- a/webapp/packages/core/public/icons/icons.svg +++ b/webapp/packages/core/public/icons/icons.svg @@ -57,6 +57,22 @@ + + + + + + + + + + + + + + + + diff --git a/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts b/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts index fe5b4ecabd..7ff93d5e5b 100644 --- a/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts +++ b/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts @@ -96,5 +96,8 @@ export const SNACKBAR_STYLES = composes( } } } + IconButton { + color: rgba(0, 0, 0, 0.45); + } ` ); diff --git a/webapp/packages/core/src/blocks/IconButton.tsx b/webapp/packages/core/src/blocks/IconButton.tsx index b72ddb6e3a..bf86605bcf 100644 --- a/webapp/packages/core/src/blocks/IconButton.tsx +++ b/webapp/packages/core/src/blocks/IconButton.tsx @@ -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%; } } `; diff --git a/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql b/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql index 8550dff72f..bf6e1fbc9a 100644 --- a/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql +++ b/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql @@ -1,3 +1,3 @@ -query deleteUser { - deleteUser +query deleteUser($userId: ID!) { + deleteUser(userId: $userId) } \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql b/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql index f9544c40d8..ba043e0904 100644 --- a/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql +++ b/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql @@ -1,4 +1,4 @@ -query getRolesList($roleId: ID) { +query getPermissionsList($roleId: ID) { permissions: listPermissions { id label diff --git a/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql b/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql index 13af993e2f..edde2bccde 100644 --- a/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql +++ b/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql @@ -1,9 +1,9 @@ query getUsersList($userId: ID) { - users: authLogin(userId: $userId) { + users: listUsers(userId: $userId) { userId - - metaParameters - configurationParameters - grantedRoles + + #metaParameters + #configurationParameters + #grantedRoles } } \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/setUserCredentials.gql b/webapp/packages/core/src/queries/Authentication/Users/setUserCredentials.gql new file mode 100644 index 0000000000..61f975b467 --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/setUserCredentials.gql @@ -0,0 +1,3 @@ +query setUserCredentials($userId: ID!, $providerId: ID!, $credentials: Object!) { + setUserCredentials(userId: $userId, providerId: $providerId, credentials: $credentials) +} \ No newline at end of file diff --git a/webapp/packages/core/src/sdk/sdk.ts b/webapp/packages/core/src/sdk/sdk.ts index bebdd4e831..c7d8dd00d3 100644 --- a/webapp/packages/core/src/sdk/sdk.ts +++ b/webapp/packages/core/src/sdk/sdk.ts @@ -14,122 +14,189 @@ export type Scalars = { DateTime: any; }; - -export type Query = { - authLogin: UserAuthInfo; - authLogout?: Maybe; - authProviders: Array; - connectionState: ConnectionInfo; - dataSourceList: Array; - dataTransferAvailableStreamProcessors: Array; - dataTransferExportDataFromContainer: AsyncTaskInfo; - dataTransferExportDataFromResults: AsyncTaskInfo; - dataTransferRemoveDataFile?: Maybe; - driverList: Array; - metadataGetNodeDDL?: Maybe; - navGetStructContainers: DatabaseStructContainers; - navNodeChildren: Array; - navNodeInfo: NavigatorNodeInfo; - navRefreshNode?: Maybe; - readSessionLog: Array; - serverConfig: ServerConfig; - sessionPermissions: Array>; - sessionState: SessionInfo; - sessionUser?: Maybe; - sqlCompletionProposals?: Maybe>>; - sqlDialectInfo?: Maybe; - sqlListContexts?: Maybe>>; -}; - - -export type QueryAuthLoginArgs = { - provider: Scalars['ID']; - credentials: Scalars['Object']; -}; - - -export type QueryConnectionStateArgs = { +export type AdminPermissionInfo = { id: Scalars['ID']; + label?: Maybe; + description?: Maybe; + provider: Scalars['String']; + category?: Maybe; +}; + +export type AdminRoleInfo = { + roleId: Scalars['ID']; + roleName?: Maybe; + rolePermissions: Array>; +}; + +export type AdminUserInfo = { + userId: Scalars['ID']; + metaParameters: Scalars['Object']; + configurationParameters: Scalars['Object']; + grantedRoles: Array>; +}; + +export type AsyncTaskInfo = { + id: Scalars['String']; + name?: Maybe; + running: Scalars['Boolean']; + status?: Maybe; + error?: Maybe; + result?: Maybe; + taskResult?: Maybe; +}; + +export enum AuthCredentialEncryption { + None = 'none', + Plain = 'plain', + Hash = 'hash' +} + +export type AuthCredentialInfo = { + id: Scalars['ID']; + displayName: Scalars['String']; + description?: Maybe; + admin?: Maybe; + user?: Maybe; + possibleValues?: Maybe>>; + encryption?: Maybe; +}; + +export type AuthProviderInfo = { + id: Scalars['ID']; + label: Scalars['String']; + icon?: Maybe; + description?: Maybe; + defaultProvider?: Maybe; + credentialParameters: Array; +}; + +export type ConnectionConfig = { + name?: Maybe; + description?: Maybe; + dataSourceId?: Maybe; + driverId?: Maybe; + host?: Maybe; + port?: Maybe; + databaseName?: Maybe; + url?: Maybe; + properties?: Maybe; + userName?: Maybe; + userPassword?: Maybe; +}; + +export type ConnectionInfo = { + id: Scalars['ID']; + driverId: Scalars['ID']; + name: Scalars['String']; + description?: Maybe; + properties?: Maybe; + connected: Scalars['Boolean']; + provided: Scalars['Boolean']; + connectTime?: Maybe; + connectionError?: Maybe; + serverVersion?: Maybe; + clientVersion?: Maybe; + features: Array; +}; + +export type DatabaseObjectInfo = { + name?: Maybe; + description?: Maybe; + type?: Maybe; + properties?: Maybe>>; + ordinalPosition?: Maybe; + fullyQualifiedName?: Maybe; + overloadedName?: Maybe; + uniqueName?: Maybe; + state?: Maybe; + features?: Maybe>>; + editors?: Maybe>>; }; -export type QueryDataTransferExportDataFromContainerArgs = { - connectionId: Scalars['ID']; - containerNodePath: Scalars['ID']; - parameters: DataTransferParameters; +export type DatabaseObjectInfoPropertiesArgs = { + filter?: Maybe; +}; + +export type DatabaseStructContainers = { + catalogList: Array; + schemaList: Array; +}; + +export type DataSourceInfo = { + id: Scalars['ID']; + driverId: Scalars['ID']; + name: Scalars['String']; + description?: Maybe; + host?: Maybe; + server?: Maybe; + port?: Maybe; + url?: Maybe; + properties?: Maybe; +}; + +export type DataTransferParameters = { + processorId: Scalars['ID']; + settings?: Maybe; + processorProperties: Scalars['Object']; + filter?: Maybe; +}; + +export type DataTransferProcessorInfo = { + id: Scalars['ID']; + name?: Maybe; + description?: Maybe; + fileExtension?: Maybe; + appFileExtension?: Maybe; + appName?: Maybe; + order: Scalars['Int']; + icon?: Maybe; + properties?: Maybe>>; + isBinary?: Maybe; + isHTML?: Maybe; }; -export type QueryDataTransferExportDataFromResultsArgs = { - connectionId: Scalars['ID']; - contextId: Scalars['ID']; - resultsId: Scalars['ID']; - parameters: DataTransferParameters; +export type DriverInfo = { + id: Scalars['ID']; + name?: Maybe; + description?: Maybe; + icon?: Maybe; + iconBig?: Maybe; + providerId?: Maybe; + driverClassName?: Maybe; + defaultPort?: Maybe; + sampleURL?: Maybe; + driverInfoURL?: Maybe; + driverPropertiesURL?: Maybe; + embedded?: Maybe; + anonymousAccess?: Maybe; + allowsEmptyPassword?: Maybe; + licenseRequired?: Maybe; + license?: Maybe; + custom?: Maybe; + promotedScore?: Maybe; + connectionProperties?: Maybe; + defaultConnectionProperties?: Maybe; + driverProperties?: Maybe>>; + driverParameters?: Maybe; }; - -export type QueryDataTransferRemoveDataFileArgs = { - dataFileId: Scalars['String']; +export type DriverPropertyInfo = { + id: Scalars['ID']; + displayName?: Maybe; + description?: Maybe; + category?: Maybe; + dataType?: Maybe; + defaultValue?: Maybe; + validValues?: Maybe>>; }; - -export type QueryDriverListArgs = { - id?: Maybe; -}; - - -export type QueryMetadataGetNodeDdlArgs = { - nodeId: Scalars['ID']; - options?: Maybe; -}; - - -export type QueryNavGetStructContainersArgs = { - connectionId: Scalars['ID']; - catalog?: Maybe; -}; - - -export type QueryNavNodeChildrenArgs = { - parentPath: Scalars['ID']; - offset?: Maybe; - limit?: Maybe; - onlyFolders?: Maybe; -}; - - -export type QueryNavNodeInfoArgs = { - nodePath: Scalars['ID']; -}; - - -export type QueryNavRefreshNodeArgs = { - nodePath: Scalars['ID']; -}; - - -export type QueryReadSessionLogArgs = { - maxEntries?: Maybe; - clearEntries?: Maybe; -}; - - -export type QuerySqlCompletionProposalsArgs = { - connectionId: Scalars['ID']; - contextId: Scalars['ID']; - query: Scalars['String']; - position: Scalars['Int']; - maxResults?: Maybe; -}; - - -export type QuerySqlDialectInfoArgs = { - connectionId: Scalars['ID']; -}; - - -export type QuerySqlListContextsArgs = { - connectionId: Scalars['ID']; +export type LogEntry = { + time?: Maybe; + type: Scalars['String']; + message?: Maybe; + stackTrace?: Maybe; }; export type Mutation = { @@ -249,39 +316,230 @@ export type MutationUpdateResultsDataArgs = { updateValues?: Maybe; }; -export type AsyncTaskInfo = { - id: Scalars['String']; +export type NavigatorNodeInfo = { + id: Scalars['ID']; name?: Maybe; - running: Scalars['Boolean']; - status?: Maybe; - error?: Maybe; - result?: Maybe; - taskResult?: Maybe; + icon?: Maybe; + description?: Maybe; + nodeType?: Maybe; + hasChildren?: Maybe; + object?: Maybe; + features?: Maybe>>; + folder?: Maybe; + inline?: Maybe; + navigable?: Maybe; }; -export type ServerError = { - message?: Maybe; - errorCode?: Maybe; - stackTrace?: Maybe; - causedBy?: Maybe; -}; -export type ServerMessage = { - time?: Maybe; - message?: Maybe; -}; - -export type ServerLanguage = { - isoCode: Scalars['String']; +export type ObjectDescriptor = { + id?: Maybe; displayName?: Maybe; - nativeName?: Maybe; + fullName?: Maybe; + uniqueName?: Maybe; + description?: Maybe; + value?: Maybe; }; -export type WebServiceConfig = { - id: Scalars['String']; - name: Scalars['String']; - description: Scalars['String']; - bundleVersion: Scalars['String']; +export type ObjectPropertyFilter = { + ids?: Maybe>>; + features?: Maybe>>; + categories?: Maybe>>; + dataTypes?: Maybe>>; +}; + +export type ObjectPropertyInfo = { + id?: Maybe; + displayName?: Maybe; + description?: Maybe; + category?: Maybe; + dataType?: Maybe; + value?: Maybe; + validValues?: Maybe>>; + defaultValue?: Maybe; + features: Array; +}; + +export type Query = { + authLogin: UserAuthInfo; + authLogout?: Maybe; + authProviders: Array; + connectionState: ConnectionInfo; + createRole: AdminRoleInfo; + createUser: AdminUserInfo; + dataSourceList: Array; + dataTransferAvailableStreamProcessors: Array; + dataTransferExportDataFromContainer: AsyncTaskInfo; + dataTransferExportDataFromResults: AsyncTaskInfo; + dataTransferRemoveDataFile?: Maybe; + deleteRole?: Maybe; + deleteUser?: Maybe; + driverList: Array; + grantUserRole?: Maybe; + listPermissions: Array>; + listRoles: Array>; + listUsers: Array>; + metadataGetNodeDDL?: Maybe; + navGetStructContainers: DatabaseStructContainers; + navNodeChildren: Array; + navNodeInfo: NavigatorNodeInfo; + navRefreshNode?: Maybe; + readSessionLog: Array; + revokeUserRole?: Maybe; + serverConfig: ServerConfig; + sessionPermissions: Array>; + sessionState: SessionInfo; + sessionUser?: Maybe; + setRolePermissions?: Maybe; + setUserCredentials?: Maybe; + sqlCompletionProposals?: Maybe>>; + sqlDialectInfo?: Maybe; + sqlListContexts?: Maybe>>; +}; + + +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; +}; + + +export type QueryGrantUserRoleArgs = { + userId: Scalars['ID']; + roleId: Scalars['ID']; +}; + + +export type QueryListRolesArgs = { + roleId?: Maybe; +}; + + +export type QueryListUsersArgs = { + userId?: Maybe; +}; + + +export type QueryMetadataGetNodeDdlArgs = { + nodeId: Scalars['ID']; + options?: Maybe; +}; + + +export type QueryNavGetStructContainersArgs = { + connectionId: Scalars['ID']; + catalog?: Maybe; +}; + + +export type QueryNavNodeChildrenArgs = { + parentPath: Scalars['ID']; + offset?: Maybe; + limit?: Maybe; + onlyFolders?: Maybe; +}; + + +export type QueryNavNodeInfoArgs = { + nodePath: Scalars['ID']; +}; + + +export type QueryNavRefreshNodeArgs = { + nodePath: Scalars['ID']; +}; + + +export type QueryReadSessionLogArgs = { + maxEntries?: Maybe; + clearEntries?: Maybe; +}; + + +export type QueryRevokeUserRoleArgs = { + userId: Scalars['ID']; + roleId: Scalars['ID']; +}; + + +export type QuerySetRolePermissionsArgs = { + roleId: Scalars['ID']; + permissions: Array>; +}; + + +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; +}; + + +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; + errorCode?: Maybe; + stackTrace?: Maybe; + causedBy?: Maybe; +}; + +export type ServerLanguage = { + isoCode: Scalars['String']; + displayName?: Maybe; + nativeName?: Maybe; +}; + +export type ServerMessage = { + time?: Maybe; + message?: Maybe; +}; + export type SessionInfo = { createTime: Scalars['String']; lastAccessTime: Scalars['String']; @@ -308,168 +584,6 @@ export type SessionInfo = { connections: Array; }; -export type DriverInfo = { - id: Scalars['ID']; - name?: Maybe; - description?: Maybe; - icon?: Maybe; - iconBig?: Maybe; - providerId?: Maybe; - driverClassName?: Maybe; - defaultPort?: Maybe; - sampleURL?: Maybe; - driverInfoURL?: Maybe; - driverPropertiesURL?: Maybe; - embedded?: Maybe; - anonymousAccess?: Maybe; - allowsEmptyPassword?: Maybe; - licenseRequired?: Maybe; - license?: Maybe; - custom?: Maybe; - promotedScore?: Maybe; - connectionProperties?: Maybe; - defaultConnectionProperties?: Maybe; - driverProperties?: Maybe>>; - driverParameters?: Maybe; -}; - -export type DriverPropertyInfo = { - id: Scalars['ID']; - displayName?: Maybe; - description?: Maybe; - category?: Maybe; - dataType?: Maybe; - defaultValue?: Maybe; - validValues?: Maybe>>; -}; - -export type DataSourceInfo = { - id: Scalars['ID']; - driverId: Scalars['ID']; - name: Scalars['String']; - description?: Maybe; - host?: Maybe; - server?: Maybe; - port?: Maybe; - url?: Maybe; - properties?: Maybe; -}; - -export type ConnectionConfig = { - name?: Maybe; - description?: Maybe; - dataSourceId?: Maybe; - driverId?: Maybe; - host?: Maybe; - port?: Maybe; - databaseName?: Maybe; - url?: Maybe; - properties?: Maybe; - userName?: Maybe; - userPassword?: Maybe; -}; - -export type ConnectionInfo = { - id: Scalars['ID']; - driverId: Scalars['ID']; - name: Scalars['String']; - description?: Maybe; - properties?: Maybe; - connected: Scalars['Boolean']; - provided: Scalars['Boolean']; - connectTime?: Maybe; - connectionError?: Maybe; - serverVersion?: Maybe; - clientVersion?: Maybe; - features: Array; -}; - -export type LogEntry = { - time?: Maybe; - type: Scalars['String']; - message?: Maybe; - stackTrace?: Maybe; -}; - -export type ObjectDescriptor = { - id?: Maybe; - displayName?: Maybe; - fullName?: Maybe; - uniqueName?: Maybe; - description?: Maybe; - value?: Maybe; -}; - -export type ObjectPropertyInfo = { - id?: Maybe; - displayName?: Maybe; - description?: Maybe; - category?: Maybe; - dataType?: Maybe; - value?: Maybe; - validValues?: Maybe>>; - defaultValue?: Maybe; - features: Array; -}; - -export type ObjectPropertyFilter = { - ids?: Maybe>>; - features?: Maybe>>; - categories?: Maybe>>; - dataTypes?: Maybe>>; -}; - -export type DatabaseObjectInfo = { - name?: Maybe; - description?: Maybe; - type?: Maybe; - properties?: Maybe>>; - ordinalPosition?: Maybe; - fullyQualifiedName?: Maybe; - overloadedName?: Maybe; - uniqueName?: Maybe; - state?: Maybe; - features?: Maybe>>; - editors?: Maybe>>; -}; - - -export type DatabaseObjectInfoPropertiesArgs = { - filter?: Maybe; -}; - -export type NavigatorNodeInfo = { - id: Scalars['ID']; - name?: Maybe; - icon?: Maybe; - description?: Maybe; - nodeType?: Maybe; - hasChildren?: Maybe; - object?: Maybe; - features?: Maybe>>; - folder?: Maybe; - inline?: Maybe; - navigable?: Maybe; -}; - -export type DatabaseStructContainers = { - catalogList: Array; - schemaList: Array; -}; - -export type SqlDialectInfo = { - name?: Maybe; - dataTypes?: Maybe>>; - functions?: Maybe>>; - reservedWords?: Maybe>>; - quoteStrings?: Maybe>>>>; - singleLineComments?: Maybe>>; - multiLineComments?: Maybe>>>>; - catalogSeparator?: Maybe; - structSeparator?: Maybe; - scriptDelimiter?: Maybe; -}; - export type SqlCompletionProposal = { displayString?: Maybe; type?: Maybe; @@ -488,6 +602,14 @@ export type SqlContextInfo = { defaultSchema?: Maybe; }; +export type SqlDataFilter = { + offset?: Maybe; + limit?: Maybe; + constraints?: Maybe>>; + where?: Maybe; + orderBy?: Maybe; +}; + export type SqlDataFilterConstraint = { attribute: Scalars['String']; orderPosition?: Maybe; @@ -497,11 +619,30 @@ export type SqlDataFilterConstraint = { value?: Maybe; }; -export type SqlDataFilter = { - offset?: Maybe; - limit?: Maybe; - constraints?: Maybe>>; - where?: Maybe; +export type SqlDialectInfo = { + name?: Maybe; + dataTypes?: Maybe>>; + functions?: Maybe>>; + reservedWords?: Maybe>>; + quoteStrings?: Maybe>>>>; + singleLineComments?: Maybe>>; + multiLineComments?: Maybe>>>>; + catalogSeparator?: Maybe; + structSeparator?: Maybe; + scriptDelimiter?: Maybe; +}; + +export type SqlExecuteInfo = { + statusMessage?: Maybe; + duration?: Maybe; + results: Array; +}; + +export type SqlQueryResults = { + title?: Maybe; + updateRowCount?: Maybe; + sourceQuery?: Maybe; + resultSet?: Maybe; }; export type SqlResultColumn = { @@ -525,44 +666,6 @@ export type SqlResultSet = { hasMoreData?: Maybe; }; -export type SqlQueryResults = { - title?: Maybe; - updateRowCount?: Maybe; - sourceQuery?: Maybe; - resultSet?: Maybe; -}; - -export type SqlExecuteInfo = { - statusMessage?: Maybe; - duration?: Maybe; - results: Array; -}; - -export enum AuthCredentialEncryption { - None = 'none', - Plain = 'plain', - Hash = 'hash' -} - -export type AuthCredentialInfo = { - id: Scalars['ID']; - displayName: Scalars['String']; - description?: Maybe; - admin?: Maybe; - user?: Maybe; - possibleValues?: Maybe>>; - encryption?: Maybe; -}; - -export type AuthProviderInfo = { - id: Scalars['ID']; - label: Scalars['String']; - icon?: Maybe; - description?: Maybe; - defaultProvider?: Maybe; - credentialParameters: Array; -}; - export type UserAuthInfo = { userId: Scalars['String']; displayName?: Maybe; @@ -571,25 +674,11 @@ export type UserAuthInfo = { message?: Maybe; }; -export type DataTransferProcessorInfo = { - id: Scalars['ID']; - name?: Maybe; - description?: Maybe; - fileExtension?: Maybe; - appFileExtension?: Maybe; - appName?: Maybe; - order: Scalars['Int']; - icon?: Maybe; - properties?: Maybe>>; - isBinary?: Maybe; - isHTML?: Maybe; -}; - -export type DataTransferParameters = { - processorId: Scalars['ID']; - settings?: Maybe; - processorProperties: Scalars['Object']; - filter?: Maybe; +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; +export type DeleteUserQueryVariables = { + userId: Scalars['ID']; +}; + + +export type DeleteUserQuery = Pick; + +export type GetPermissionsListQueryVariables = { + roleId?: Maybe; +}; + + +export type GetPermissionsListQuery = { permissions: Array>> }; + +export type GetRolesListQueryVariables = { + roleId?: Maybe; +}; + + +export type GetRolesListQuery = { roles: Array>> }; + +export type GetUsersListQueryVariables = { + userId?: Maybe; +}; + + +export type GetUsersListQuery = { users: Array>> }; + +export type SetUserCredentialsQueryVariables = { + userId: Scalars['ID']; + providerId: Scalars['ID']; + credentials: Scalars['Object']; +}; + + +export type SetUserCredentialsQuery = Pick; + 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 { return withWrapper(() => client.request(ChangeSessionLanguageDocument, variables)); }, + deleteUser(variables: DeleteUserQueryVariables): Promise { + return withWrapper(() => client.request(DeleteUserDocument, variables)); + }, + getPermissionsList(variables?: GetPermissionsListQueryVariables): Promise { + return withWrapper(() => client.request(GetPermissionsListDocument, variables)); + }, + getRolesList(variables?: GetRolesListQueryVariables): Promise { + return withWrapper(() => client.request(GetRolesListDocument, variables)); + }, + getUsersList(variables?: GetUsersListQueryVariables): Promise { + return withWrapper(() => client.request(GetUsersListDocument, variables)); + }, + setUserCredentials(variables: SetUserCredentialsQueryVariables): Promise { + return withWrapper(() => client.request(SetUserCredentialsDocument, variables)); + }, authLogin(variables: AuthLoginQueryVariables): Promise { return withWrapper(() => client.request(AuthLoginDocument, variables)); }, diff --git a/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx b/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx index 04faf81739..e581643c88 100644 --- a/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx +++ b/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx @@ -34,6 +34,9 @@ const styles = css` margin: 0; } } + IconButton { + color: rgba(0, 0, 0, 0.45); + } `; export const ExportNotification = observer(function ExportNotification({