diff --git a/webapp/packages/core/locales/en.json b/webapp/packages/core/locales/en.json index bc1f311fde..3cd2791c2f 100644 --- a/webapp/packages/core/locales/en.json +++ b/webapp/packages/core/locales/en.json @@ -53,6 +53,8 @@ "app_shared_settingsMenu_config": "Configuration", "app_shared_settingsMenu_theme": "Theme", "app_shared_settingsMenu_lang": "Language", + "app_navigationTree_openNodeTab": "Open", + "app_navigationTree_refreshNode": "Refresh", "core_eventsLog_dbeaverErrorDetails": "Error details", "app_shared_inlineEditor_dialog_title": "Edit mode", "app_shared_inlineEditor_dialog_apply": "Apply", @@ -62,4 +64,4 @@ "app_log_view_entry_timestamp": "Timestamp", "app_log_view_entry_message": "Message", "app_log_view_entry_details": "Details" -} \ No newline at end of file +} diff --git a/webapp/packages/core/locales/ru.json b/webapp/packages/core/locales/ru.json index d5283948fc..4817fabfff 100644 --- a/webapp/packages/core/locales/ru.json +++ b/webapp/packages/core/locales/ru.json @@ -53,6 +53,8 @@ "app_shared_settingsMenu_config": "Настройки", "app_shared_settingsMenu_theme": "Тема", "app_shared_settingsMenu_lang": "Язык", + "app_navigationTree_openNodeTab": "Открыть", + "app_navigationTree_refreshNode": "Обновить", "core_eventsLog_dbeaverErrorDetails": "Детали ошибки", "app_shared_inlineEditor_dialog_title": "Редактирование", "app_shared_inlineEditor_dialog_apply": "Применить", @@ -62,4 +64,4 @@ "app_log_view_entry_timestamp": "Время", "app_log_view_entry_message": "Сообщение", "app_log_view_entry_details": "Детали" -} \ No newline at end of file +} diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts index dc9acbc04d..34624f99b6 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts @@ -44,12 +44,26 @@ export class NavigationTreeContextMenuService { return context.contextType === NavigationTreeContextMenuService.nodeContextType; }, order: 1, - title: 'Open', + title: 'app_navigationTree_openNodeTab', onClick: (context: IMenuContext) => { const node = context.data; this.nodesManagerService.navToNode(node.id); }, }; this.contextMenuService.addMenuItem(this.contextMenuService.getRootMenuToken(), openNodeTab); + + const refreshNode: IContextMenuItem = { + id: 'refreshNode', + isPresent(context) { + return context.contextType === NavigationTreeContextMenuService.nodeContextType; + }, + order: Number.MAX_SAFE_INTEGER, + title: 'app_navigationTree_refreshNode', + onClick: (context: IMenuContext) => { + const node = context.data; + this.nodesManagerService.refreshNode(node.id); + }, + }; + this.contextMenuService.addMenuItem(this.contextMenuService.getRootMenuToken(), refreshNode); } } diff --git a/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts b/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts index df9372b677..8457b6c613 100644 --- a/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts +++ b/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts @@ -80,6 +80,12 @@ export class NodesManagerService { }); } + async refreshNode(nodeId: string) { + await this.purgeServerCache(nodeId); + this.nodesStore.removeNode(nodeId); + await this.updateNodeInfo(nodeId); + } + getDatabaseObjectInfo(nodeId: string): DatabaseObjectInfoWithId | undefined { return this.nodesStore.getDatabaseObjectInfo(nodeId); } @@ -123,6 +129,12 @@ export class NodesManagerService { return info; } + async purgeServerCache(nodeId: string) { + await this.graphQLService.gql.navRefreshNode({ + nodePath: nodeId, + }); + } + async updateChildren(parentId: string) { const { navNodeChildren } = await this.graphQLService.gql.navNodeChildren({ parentPath: parentId, diff --git a/webapp/packages/core/src/app/shared/NodesManager/queries/navRefreshNode.gql b/webapp/packages/core/src/app/shared/NodesManager/queries/navRefreshNode.gql new file mode 100644 index 0000000000..a9aa79327c --- /dev/null +++ b/webapp/packages/core/src/app/shared/NodesManager/queries/navRefreshNode.gql @@ -0,0 +1,3 @@ +query navRefreshNode($nodePath: ID!) { + navRefreshNode(nodePath: $nodePath) +} diff --git a/webapp/packages/core/src/dialogs/CommonDialog/styles.ts b/webapp/packages/core/src/dialogs/CommonDialog/styles.ts index 5a48c6f4a6..41474ca43d 100644 --- a/webapp/packages/core/src/dialogs/CommonDialog/styles.ts +++ b/webapp/packages/core/src/dialogs/CommonDialog/styles.ts @@ -29,5 +29,6 @@ export const dialogStyles = css` max-height: calc(100vh); transform: translate(-50%, -50%); z-index: 999; + outline: none; } `; diff --git a/webapp/packages/core/src/sdk/sdk.ts b/webapp/packages/core/src/sdk/sdk.ts index c7d8dd00d3..f50630ea6a 100644 --- a/webapp/packages/core/src/sdk/sdk.ts +++ b/webapp/packages/core/src/sdk/sdk.ts @@ -771,6 +771,13 @@ export type NavNodeInfoQuery = { navNodeInfo: ( & { object?: Maybe> } ); }; +export type NavRefreshNodeQueryVariables = { + nodePath: Scalars['ID']; +}; + + +export type NavRefreshNodeQuery = Pick; + export type QueryChildrenDatabaseObjectInfoQueryVariables = { nodePath: Scalars['ID']; filter?: Maybe; @@ -1272,6 +1279,11 @@ export const NavNodeInfoDocument = ` } } `; +export const NavRefreshNodeDocument = ` + query navRefreshNode($nodePath: ID!) { + navRefreshNode(nodePath: $nodePath) +} + `; export const QueryChildrenDatabaseObjectInfoDocument = ` query queryChildrenDatabaseObjectInfo($nodePath: ID!, $filter: ObjectPropertyFilter) { childrenDatabaseObjectInfo: navNodeChildren(parentPath: $nodePath) { @@ -1808,6 +1820,9 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = navNodeInfo(variables: NavNodeInfoQueryVariables): Promise { return withWrapper(() => client.request(NavNodeInfoDocument, variables)); }, + navRefreshNode(variables: NavRefreshNodeQueryVariables): Promise { + return withWrapper(() => client.request(NavRefreshNodeDocument, variables)); + }, queryChildrenDatabaseObjectInfo(variables: QueryChildrenDatabaseObjectInfoQueryVariables): Promise { return withWrapper(() => client.request(QueryChildrenDatabaseObjectInfoDocument, variables)); },