From b733f395d37b9104f84131ef7c42075432a08744 Mon Sep 17 00:00:00 2001 From: Alexey Potsetsuev Date: Fri, 12 Sep 2025 23:21:54 +0800 Subject: [PATCH] dbeaver/pro#6847 fix: elements order (#3729) * dbeaver/pro#6847 fix: elements order * fix: linting * fix: actions order * fix: actions order --------- Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com> --- .../src/ContextMenu/MenuBar/MenuBar.tsx | 8 +-- .../src/ContextMenu/MenuItemRenderer.tsx | 4 +- .../core-view/src/Menu/MenuItem/IMenuItem.ts | 6 +- .../core-view/src/Menu/menuExtractItems.ts | 17 +++-- .../core-view/src/Menu/menuItemsPlaceAfter.ts | 24 +++++++ webapp/packages/core-view/src/index.ts | 1 + .../src/PluginBootstrap.ts | 52 +++++++-------- .../src/PluginBootstrap.ts | 50 ++++++-------- .../src/SearchConnectionPluginBootstrap.ts | 5 +- .../packages/plugin-data-import/package.json | 1 + .../packages/plugin-data-import/src/module.ts | 2 + .../packages/plugin-data-import/tsconfig.json | 3 + .../ConnectionSchemaManagerBootstrap.ts | 5 +- .../TransactionLog/TransactionInfoAction.tsx | 11 +++- .../src/TransactionManagerBootstrap.ts | 66 +++++++++---------- .../src/LogViewer/LogViewerBootstrap.ts | 6 +- .../src/PluginBootstrap.ts | 4 +- .../src/PluginBootstrap.ts | 7 +- .../src/SqlEditorBootstrap.ts | 17 +---- .../src/SqlEditorGroupTabsBootstrap.ts | 9 +-- .../plugin-sql-generator/src/index.ts | 1 + webapp/yarn.lock | 1 + 22 files changed, 152 insertions(+), 148 deletions(-) create mode 100644 webapp/packages/core-view/src/Menu/menuItemsPlaceAfter.ts diff --git a/webapp/packages/core-ui/src/ContextMenu/MenuBar/MenuBar.tsx b/webapp/packages/core-ui/src/ContextMenu/MenuBar/MenuBar.tsx index 7fa8691458..4828b1e14f 100644 --- a/webapp/packages/core-ui/src/ContextMenu/MenuBar/MenuBar.tsx +++ b/webapp/packages/core-ui/src/ContextMenu/MenuBar/MenuBar.tsx @@ -93,8 +93,8 @@ interface IMenuBarElementProps { const MenuBarElement = observer(function MenuBarElement({ item, menuData, nestedMenuSettings, className, rtl }) { const onClick = useCallback(() => { - item.events?.onSelect?.(); - }, [item]); + item.events?.onSelect?.(menuData.context); + }, [item, menuData.context]); if (item.hidden) { return null; @@ -147,7 +147,7 @@ export interface IMenuBarActionProps { } export const MenuBarAction = registry( - observer(function MenuBarAction({ item, parentMenuInfo, submenu, className }) { + observer(function MenuBarAction({ item, parentMenuInfo, submenu, context, className }) { const translate = useTranslate(); const actionInfo = item.action.actionInfo; const loading = item.action.isLoading(); @@ -158,7 +158,7 @@ export const MenuBarAction = registry( const title = translate(actionInfo.tooltip ?? actionInfo.label); function handleClick() { - item.events?.onSelect?.(); + item.events?.onSelect?.(context); item.action.activate(); } diff --git a/webapp/packages/core-ui/src/ContextMenu/MenuItemRenderer.tsx b/webapp/packages/core-ui/src/ContextMenu/MenuItemRenderer.tsx index 428aa75171..fb7234c25f 100644 --- a/webapp/packages/core-ui/src/ContextMenu/MenuItemRenderer.tsx +++ b/webapp/packages/core-ui/src/ContextMenu/MenuItemRenderer.tsx @@ -36,13 +36,13 @@ export const MenuItemRenderer = observer(function MenuIt const translate = useTranslate(); const onClick = useCallback( (keepMenuOpen = true) => { - item.events?.onSelect?.(); + item.events?.onSelect?.(menuData.context); if (!(item instanceof MenuSubMenuItem) && keepMenuOpen) { onItemClose?.(); } }, - [item, onItemClose], + [item, onItemClose, menuData.context], ); if (isMenuCustomItem(item)) { diff --git a/webapp/packages/core-view/src/Menu/MenuItem/IMenuItem.ts b/webapp/packages/core-view/src/Menu/MenuItem/IMenuItem.ts index 2f844fdd2e..84588626d4 100644 --- a/webapp/packages/core-view/src/Menu/MenuItem/IMenuItem.ts +++ b/webapp/packages/core-view/src/Menu/MenuItem/IMenuItem.ts @@ -1,13 +1,15 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 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 type { IDataContextProvider } from '@cloudbeaver/core-data-context'; + export interface IMenuItemEvents { - onSelect?: () => void; + onSelect?: (context: IDataContextProvider) => void; } export interface IMenuItem { diff --git a/webapp/packages/core-view/src/Menu/menuExtractItems.ts b/webapp/packages/core-view/src/Menu/menuExtractItems.ts index 81594a7dae..1e67e68617 100644 --- a/webapp/packages/core-view/src/Menu/menuExtractItems.ts +++ b/webapp/packages/core-view/src/Menu/menuExtractItems.ts @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -9,18 +9,21 @@ import type { IAction } from '../Action/IAction.js'; import type { MenuCreatorItem } from './IMenuItemsCreator.js'; import type { IMenuItem } from './MenuItem/IMenuItem.js'; -type MenuItem = IMenuItem | IAction; +export type MenuExtractItem = IMenuItem | IAction | string; -export function menuExtractItems(items: MenuCreatorItem[], actions: MenuItem[]): MenuItem[] { - const list: MenuItem[] = []; +export function menuExtractItems(items: MenuCreatorItem[], actions: MenuExtractItem[]): MenuCreatorItem[] { + const list: MenuCreatorItem[] = []; for (const action of actions) { - const index = items.indexOf(action); + const index = menuFindIndex(items, action); if (index > -1) { - items.splice(index, 1); - list.push(action); + list.push(...items.splice(index, 1)); } } return list; } + +export function menuFindIndex(items: MenuCreatorItem[], action: MenuExtractItem): number { + return typeof action === 'string' ? items.findIndex(item => item.id === action) : items.indexOf(action); +} diff --git a/webapp/packages/core-view/src/Menu/menuItemsPlaceAfter.ts b/webapp/packages/core-view/src/Menu/menuItemsPlaceAfter.ts new file mode 100644 index 0000000000..e4a4969c97 --- /dev/null +++ b/webapp/packages/core-view/src/Menu/menuItemsPlaceAfter.ts @@ -0,0 +1,24 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2025 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 type { MenuCreatorItem } from './IMenuItemsCreator.js'; +import { menuExtractItems, menuFindIndex, type MenuExtractItem } from './menuExtractItems.js'; + +export function menuItemsPlaceAfter(items: MenuCreatorItem[], actions: MenuExtractItem[], after: MenuExtractItem): void { + let anchorItemIndex = menuFindIndex(items, after); + + if (anchorItemIndex !== -1) { + const extracted = menuExtractItems(items, actions); + anchorItemIndex = menuFindIndex(items, after); + + if (anchorItemIndex === -1) { + anchorItemIndex = items.length - 1; + } + + items.splice(anchorItemIndex + 1, 0, ...extracted); + } +} diff --git a/webapp/packages/core-view/src/index.ts b/webapp/packages/core-view/src/index.ts index d82e1c2163..afc39bd2e1 100644 --- a/webapp/packages/core-view/src/index.ts +++ b/webapp/packages/core-view/src/index.ts @@ -73,6 +73,7 @@ export * from './Menu/DATA_CONTEXT_SUBMENU_ITEM.js'; export * from './Menu/IMenu.js'; export * from './Menu/IMenuInfo.js'; export * from './Menu/menuExtractItems.js'; +export * from './Menu/menuItemsPlaceAfter.js'; export * from './Menu/MenuService.js'; export * from './Menu/useMenu.js'; export * from './Menu/useMenuContext.js'; diff --git a/webapp/packages/plugin-administration/src/PluginBootstrap.ts b/webapp/packages/plugin-administration/src/PluginBootstrap.ts index 639501da28..2aebe00b77 100644 --- a/webapp/packages/plugin-administration/src/PluginBootstrap.ts +++ b/webapp/packages/plugin-administration/src/PluginBootstrap.ts @@ -11,7 +11,7 @@ import { AdministrationScreenService } from '@cloudbeaver/core-administration'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { EAdminPermission, PermissionsService } from '@cloudbeaver/core-root'; import { ScreenService } from '@cloudbeaver/core-routing'; -import { MenuBaseItem, MenuService } from '@cloudbeaver/core-view'; +import { MenuBaseItem, menuExtractItems, MenuService } from '@cloudbeaver/core-view'; import { TOP_NAV_BAR_SETTINGS_MENU } from '@cloudbeaver/plugin-settings-menu'; import { AdministrationTopAppBarService } from './AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBarService.js'; @@ -35,49 +35,41 @@ export class PluginBootstrap extends Bootstrap { this.administrationTopAppBarService.placeholder.add(AdministrationMenu, 0); this.administrationTopAppBarService.placeholder.add(AppStateMenu); + const ADMINISTRATION_MENU_OPEN = new MenuBaseItem( + { + id: 'administrationMenuEnter', + label: 'administration_menu_enter', + tooltip: 'administration_menu_enter', + }, + { onSelect: () => this.administrationScreenService.navigateToRoot() }, + ); + + const ADMINISTRATION_MENU_BACK = new MenuBaseItem( + { + id: 'administrationMenuBack', + label: 'administration_menu_back', + tooltip: 'administration_menu_back', + }, + { onSelect: () => this.screenService.navigateToRoot() }, + ); + this.menuService.addCreator({ menus: [TOP_NAV_BAR_SETTINGS_MENU], getItems: (context, items) => { const administrationScreen = this.screenService.isActive(AdministrationScreenService.screenName); if (this.permissionsService.has(EAdminPermission.admin) && !administrationScreen) { - return [ - ...items, - new MenuBaseItem( - { - id: 'administrationMenuEnter', - label: 'administration_menu_enter', - tooltip: 'administration_menu_enter', - }, - { onSelect: () => this.administrationScreenService.navigateToRoot() }, - ), - ]; + return [...items, ADMINISTRATION_MENU_OPEN]; } if (administrationScreen) { - return [ - ...items, - new MenuBaseItem( - { - id: 'administrationMenuBack', - label: 'administration_menu_back', - tooltip: 'administration_menu_back', - }, - { onSelect: () => this.screenService.navigateToRoot() }, - ), - ]; + return [...items, ADMINISTRATION_MENU_BACK]; } return items; }, orderItems: (context, items) => { - const index = items.findIndex(item => item.id === 'administrationMenuBack' || item.id === 'administrationMenuEnter'); - - if (index > -1) { - const item = items.splice(index, 1); - items.unshift(item[0]!); - } - + items.unshift(...menuExtractItems(items, [ADMINISTRATION_MENU_OPEN, ADMINISTRATION_MENU_BACK])); return items; }, }); diff --git a/webapp/packages/plugin-authentication/src/PluginBootstrap.ts b/webapp/packages/plugin-authentication/src/PluginBootstrap.ts index 66e3ad238f..538b4673c6 100644 --- a/webapp/packages/plugin-authentication/src/PluginBootstrap.ts +++ b/webapp/packages/plugin-authentication/src/PluginBootstrap.ts @@ -8,7 +8,7 @@ import { UserInfoResource } from '@cloudbeaver/core-authentication'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { ServerConfigResource } from '@cloudbeaver/core-root'; -import { MenuBaseItem, MenuService } from '@cloudbeaver/core-view'; +import { MenuBaseItem, menuExtractItems, MenuService } from '@cloudbeaver/core-view'; import { TOP_NAV_BAR_SETTINGS_MENU } from '@cloudbeaver/plugin-settings-menu'; import { AuthenticationService } from './AuthenticationService.js'; @@ -25,47 +25,37 @@ export class PluginBootstrap extends Bootstrap { } override register(): void { + const LOGIN_ITEM = new MenuBaseItem( + { + id: 'login', + label: 'authentication_login', + tooltip: 'authentication_login', + }, + { onSelect: () => this.authenticationService.authUser(null, false) }, + ); + const LOGOUT_ITEM = new MenuBaseItem( + { + id: 'logout', + label: 'authentication_logout', + tooltip: 'authentication_logout', + }, + { onSelect: () => this.authenticationService.logout() }, + ); this.menuService.addCreator({ menus: [TOP_NAV_BAR_SETTINGS_MENU], getItems: (context, items) => { if (this.serverConfigResource.enabledAuthProviders.length > 0 && this.userInfoResource.isAnonymous()) { - return [ - ...items, - new MenuBaseItem( - { - id: 'login', - label: 'authentication_login', - tooltip: 'authentication_login', - }, - { onSelect: () => this.authenticationService.authUser(null, false) }, - ), - ]; + return [...items, LOGIN_ITEM]; } if (this.userInfoResource.isAuthenticated()) { - return [ - ...items, - new MenuBaseItem( - { - id: 'logout', - label: 'authentication_logout', - tooltip: 'authentication_logout', - }, - { onSelect: () => this.authenticationService.logout() }, - ), - ]; + return [...items, LOGOUT_ITEM]; } return items; }, orderItems: (context, items) => { - const index = items.findIndex(item => item.id === 'logout' || item.id === 'login'); - - if (index > -1) { - const item = items.splice(index, 1); - items.push(item[0]!); - } - + items.push(...menuExtractItems(items, [LOGIN_ITEM, LOGOUT_ITEM])); return items; }, }); diff --git a/webapp/packages/plugin-connection-search/src/SearchConnectionPluginBootstrap.ts b/webapp/packages/plugin-connection-search/src/SearchConnectionPluginBootstrap.ts index 0de4087404..08f2854a27 100644 --- a/webapp/packages/plugin-connection-search/src/SearchConnectionPluginBootstrap.ts +++ b/webapp/packages/plugin-connection-search/src/SearchConnectionPluginBootstrap.ts @@ -44,10 +44,7 @@ export class SearchConnectionPluginBootstrap extends Bootstrap { menus: [MENU_CONNECTIONS, MENU_TREE_CREATE_CONNECTION], getItems: (context, items) => [...items, ACTION_CONNECTION_SEARCH], orderItems: (context, items) => { - const actions = menuExtractItems(items, [ACTION_CONNECTION_SEARCH]); - - items.push(...actions); - + items.push(...menuExtractItems(items, [ACTION_CONNECTION_SEARCH])); return items; }, }); diff --git a/webapp/packages/plugin-data-import/package.json b/webapp/packages/plugin-data-import/package.json index 87c331d6b1..8666e8bc04 100644 --- a/webapp/packages/plugin-data-import/package.json +++ b/webapp/packages/plugin-data-import/package.json @@ -33,6 +33,7 @@ "@cloudbeaver/core-settings": "workspace:*", "@cloudbeaver/core-utils": "workspace:*", "@cloudbeaver/core-view": "workspace:*", + "@cloudbeaver/plugin-data-export": "workspace:*", "@cloudbeaver/plugin-data-viewer": "workspace:*", "mobx": "^6", "mobx-react-lite": "^4", diff --git a/webapp/packages/plugin-data-import/src/module.ts b/webapp/packages/plugin-data-import/src/module.ts index 8af54b7c43..d3517942a9 100644 --- a/webapp/packages/plugin-data-import/src/module.ts +++ b/webapp/packages/plugin-data-import/src/module.ts @@ -13,6 +13,8 @@ import { DataImportProcessorsResource } from './DataImportProcessorsResource.js' import { DataImportSettingsService } from './DataImportSettingsService.js'; import { DataImportBootstrap } from './DataImportBootstrap.js'; +// force registration after export plugin +import '@cloudbeaver/plugin-data-export'; ModuleRegistry.add({ name: '@cloudbeaver/plugin-data-import', diff --git a/webapp/packages/plugin-data-import/tsconfig.json b/webapp/packages/plugin-data-import/tsconfig.json index 501f8c92bf..e2247b3f55 100644 --- a/webapp/packages/plugin-data-import/tsconfig.json +++ b/webapp/packages/plugin-data-import/tsconfig.json @@ -46,6 +46,9 @@ { "path": "../core-view" }, + { + "path": "../plugin-data-export" + }, { "path": "../plugin-data-viewer" } diff --git a/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts b/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts index fdb00d5b70..48b0175ef8 100644 --- a/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts +++ b/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts @@ -408,9 +408,8 @@ export class ConnectionSchemaManagerBootstrap extends Bootstrap { menus: [MENU_APP_ACTIONS], getItems: (context, items) => [...items, MENU_CONNECTION_SELECTOR, MENU_CONNECTION_DATA_CONTAINER_SELECTOR], orderItems: (context, items) => { - const extracted = menuExtractItems(items, [MENU_CONNECTION_SELECTOR, MENU_CONNECTION_DATA_CONTAINER_SELECTOR]); - - return [...items, ...extracted]; + items.push(...menuExtractItems(items, [MENU_CONNECTION_SELECTOR, MENU_CONNECTION_DATA_CONTAINER_SELECTOR])); + return items; }, }); } diff --git a/webapp/packages/plugin-datasource-transaction-manager/src/TransactionLog/TransactionInfoAction.tsx b/webapp/packages/plugin-datasource-transaction-manager/src/TransactionLog/TransactionInfoAction.tsx index b436b663a9..af59c8222d 100644 --- a/webapp/packages/plugin-datasource-transaction-manager/src/TransactionLog/TransactionInfoAction.tsx +++ b/webapp/packages/plugin-datasource-transaction-manager/src/TransactionLog/TransactionInfoAction.tsx @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -35,7 +35,14 @@ export const TransactionInfoAction: ICustomMenuItemComponent = observer(function } return ( - props.item.events?.onSelect?.()}> + props.item.events?.onSelect?.(props.context)} + > {count} ); diff --git a/webapp/packages/plugin-datasource-transaction-manager/src/TransactionManagerBootstrap.ts b/webapp/packages/plugin-datasource-transaction-manager/src/TransactionManagerBootstrap.ts index 24544749d7..a94590bd8c 100644 --- a/webapp/packages/plugin-datasource-transaction-manager/src/TransactionManagerBootstrap.ts +++ b/webapp/packages/plugin-datasource-transaction-manager/src/TransactionManagerBootstrap.ts @@ -24,7 +24,7 @@ import { ExecutorInterrupter, type IExecutionContextProvider } from '@cloudbeave import { LocalizationService } from '@cloudbeaver/core-localization'; import { OptionsPanelService } from '@cloudbeaver/core-ui'; import { isNotNullDefined } from '@dbeaver/js-helpers'; -import { ActionService, MenuCustomItem, menuExtractItems, MenuService } from '@cloudbeaver/core-view'; +import { ActionService, MenuCustomItem, menuItemsPlaceAfter, MenuService } from '@cloudbeaver/core-view'; import { ConnectionSchemaManagerService } from '@cloudbeaver/plugin-datasource-context-switch'; import { MENU_APP_ACTIONS } from '@cloudbeaver/plugin-top-app-bar'; import { MENU_TOOLS } from '@cloudbeaver/plugin-tools-panel'; @@ -81,6 +81,26 @@ export class TransactionManagerBootstrap extends Bootstrap { override register() { this.connectionsManagerService.onDisconnect.addHandler(this.disconnectHandler.bind(this)); + const TRANSACTION_INFO_ITEM = new MenuCustomItem( + { + id: 'transaction-info', + getComponent: () => TransactionInfoAction, + }, + { + onSelect: async () => { + const transaction = this.getContextTransaction(); + + if (transaction) { + await this.commonDialogService.open(TransactionLogDialog, { + transaction, + onCommit: () => this.commit(transaction), + onRollback: () => this.rollback(transaction), + }); + } + }, + }, + ); + this.menuService.addCreator({ menus: [MENU_APP_ACTIONS], isApplicable: () => { @@ -105,44 +125,22 @@ export class TransactionManagerBootstrap extends Bootstrap { ]; if (transaction && transaction.autoCommit === false) { - result.push( - new MenuCustomItem( - { - id: 'transaction-info', - getComponent: () => TransactionInfoAction, - }, - { - onSelect: async () => { - await this.commonDialogService.open(TransactionLogDialog, { - transaction, - onCommit: () => this.commit(transaction), - onRollback: () => this.rollback(transaction), - }); - }, - }, - ), - ); + result.push(TRANSACTION_INFO_ITEM); } return result; }, orderItems: (context, items) => { - const actions = menuExtractItems(items, [ - ACTION_DATASOURCE_TRANSACTION_COMMIT, - ACTION_DATASOURCE_TRANSACTION_ROLLBACK, - ACTION_DATASOURCE_TRANSACTION_COMMIT_MODE_TOGGLE, - ]); - - const infoElementIndex = items.findIndex(item => item.id === 'transaction-info'); - - if (infoElementIndex !== -1) { - actions.push(...items.splice(infoElementIndex, 1)); - } - - if (actions.length > 0) { - const toolsItem = items.indexOf(MENU_TOOLS); - items.splice(toolsItem === -1 ? items.length : toolsItem + 1, 0, ...actions); - } + menuItemsPlaceAfter( + items, + [ + ACTION_DATASOURCE_TRANSACTION_COMMIT, + ACTION_DATASOURCE_TRANSACTION_ROLLBACK, + ACTION_DATASOURCE_TRANSACTION_COMMIT_MODE_TOGGLE, + TRANSACTION_INFO_ITEM, + ], + MENU_TOOLS, + ); return items; }, diff --git a/webapp/packages/plugin-log-viewer/src/LogViewer/LogViewerBootstrap.ts b/webapp/packages/plugin-log-viewer/src/LogViewer/LogViewerBootstrap.ts index d5a171b293..fe7cc8a546 100644 --- a/webapp/packages/plugin-log-viewer/src/LogViewer/LogViewerBootstrap.ts +++ b/webapp/packages/plugin-log-viewer/src/LogViewer/LogViewerBootstrap.ts @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -31,8 +31,8 @@ export class LogViewerBootstrap extends Bootstrap { menus: [MENU_TOOLS], getItems: (context, items) => [...items, ACTION_LOG_VIEWER_ENABLE], orderItems: (context, items) => { - const extracted = menuExtractItems(items, [ACTION_LOG_VIEWER_ENABLE]); - return [...items, ...extracted]; + items.push(...menuExtractItems(items, [ACTION_LOG_VIEWER_ENABLE])); + return items; }, }); diff --git a/webapp/packages/plugin-resource-manager-scripts/src/PluginBootstrap.ts b/webapp/packages/plugin-resource-manager-scripts/src/PluginBootstrap.ts index bf03e3fe4e..0138ce9c0d 100644 --- a/webapp/packages/plugin-resource-manager-scripts/src/PluginBootstrap.ts +++ b/webapp/packages/plugin-resource-manager-scripts/src/PluginBootstrap.ts @@ -48,8 +48,8 @@ export class PluginBootstrap extends Bootstrap { menus: [MENU_TOOLS], getItems: (context, items) => [...items, ACTION_RESOURCE_MANAGER_SCRIPTS], orderItems: (context, items) => { - const extracted = menuExtractItems(items, [ACTION_RESOURCE_MANAGER_SCRIPTS]); - return [...extracted, ...items]; + items.unshift(...menuExtractItems(items, [ACTION_RESOURCE_MANAGER_SCRIPTS])); + return items; }, }); diff --git a/webapp/packages/plugin-settings-menu/src/PluginBootstrap.ts b/webapp/packages/plugin-settings-menu/src/PluginBootstrap.ts index 88e920cbe4..0899d3a104 100644 --- a/webapp/packages/plugin-settings-menu/src/PluginBootstrap.ts +++ b/webapp/packages/plugin-settings-menu/src/PluginBootstrap.ts @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -26,9 +26,8 @@ export class PluginBootstrap extends Bootstrap { menus: [MENU_APP_STATE], getItems: (context, items) => [...items, TOP_NAV_BAR_SETTINGS_MENU], orderItems: (context, items) => { - const extracted = menuExtractItems(items, [TOP_NAV_BAR_SETTINGS_MENU]); - - return [...items, ...extracted]; + items.push(...menuExtractItems(items, [TOP_NAV_BAR_SETTINGS_MENU])); + return items; }, }); } diff --git a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts index f6eb1b24e2..e16abc05f0 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts @@ -95,12 +95,7 @@ export class SqlEditorBootstrap extends Bootstrap { contexts: [DATA_CONTEXT_SQL_EDITOR_STATE, DATA_CONTEXT_SQL_EDITOR_TAB], getItems: (context, items) => [...items, ACTION_RENAME], orderItems: (context, items) => { - const actions = menuExtractItems(items, [ACTION_RENAME]); - - if (actions.length > 0) { - items.unshift(...actions); - } - + items.unshift(...menuExtractItems(items, [ACTION_RENAME])); return items; }, }); @@ -119,12 +114,7 @@ export class SqlEditorBootstrap extends Bootstrap { }, getItems: (context, items) => [...items, ACTION_SQL_EDITOR_OPEN], orderItems: (context, items) => { - const actions = menuExtractItems(items, [ACTION_OPEN, ACTION_SQL_EDITOR_OPEN]); - - if (actions.length > 0) { - items.unshift(...actions); - } - + items.unshift(...menuExtractItems(items, [ACTION_OPEN, ACTION_SQL_EDITOR_OPEN])); return items; }, }); @@ -211,10 +201,9 @@ export class SqlEditorBootstrap extends Bootstrap { menus: [MENU_APP_ACTIONS], getItems: (context, items) => [...items, ACTION_SQL_EDITOR_NEW], orderItems: (context, items) => { - let placeIndex = items.indexOf(ACTION_SQL_EDITOR_NEW); - const actionsOpen = menuExtractItems(items, [ACTION_SQL_EDITOR_NEW]); + let placeIndex = items.indexOf(ACTION_SQL_EDITOR_NEW); const connectionsIndex = items.indexOf(MENU_CONNECTIONS); if (connectionsIndex !== -1) { diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditorGroupTabsBootstrap.ts b/webapp/packages/plugin-sql-editor/src/SqlEditorGroupTabsBootstrap.ts index 4f641526be..1617560d64 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditorGroupTabsBootstrap.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditorGroupTabsBootstrap.ts @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -35,12 +35,7 @@ export class SqlEditorGroupTabsBootstrap extends Bootstrap { }, getItems: (context, items) => [...items, ACTION_TAB_CLOSE_SQL_RESULT_GROUP], orderItems: (context, items) => { - const actions = menuExtractItems(items, [ACTION_TAB_CLOSE_SQL_RESULT_GROUP]); - - if (actions.length > 0) { - items.push(...actions); - } - + items.push(...menuExtractItems(items, [ACTION_TAB_CLOSE_SQL_RESULT_GROUP])); return items; }, }); diff --git a/webapp/packages/plugin-sql-generator/src/index.ts b/webapp/packages/plugin-sql-generator/src/index.ts index 7ac952dfa7..b72a289d80 100644 --- a/webapp/packages/plugin-sql-generator/src/index.ts +++ b/webapp/packages/plugin-sql-generator/src/index.ts @@ -11,6 +11,7 @@ import { sqlGeneratorPlugin } from './manifest.js'; export * from './SqlGenerators/SqlGeneratorsResource.js'; export * from './SqlGenerators/SqlGeneratorsBootstrap.js'; +export * from './actions/ACTION_SQL_GENERATE.js'; export { sqlGeneratorPlugin }; export default sqlGeneratorPlugin; diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 2e43437384..cfd011197d 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2768,6 +2768,7 @@ __metadata: "@cloudbeaver/core-settings": "workspace:*" "@cloudbeaver/core-utils": "workspace:*" "@cloudbeaver/core-view": "workspace:*" + "@cloudbeaver/plugin-data-export": "workspace:*" "@cloudbeaver/plugin-data-viewer": "workspace:*" "@cloudbeaver/tsconfig": "workspace:*" "@dbeaver/cli": "workspace:*"