aiProfileFormService.close()}>
- {formState.state.name || translate('ui_stepper_back')}
+
+ {creating ? translate('plugin_ai_administration_profile_create') : `${translate('ui_edit')} "${formState.state.name}"`}
+
diff --git a/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesPanel.tsx b/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesPanel.tsx
index 332d20f136..a7f4e9085b 100644
--- a/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesPanel.tsx
+++ b/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesPanel.tsx
@@ -55,7 +55,7 @@ export const AIProfilesPanel = observer
(function AIProfilesPanel({ formSt
const profiles = profilesLoader.data.filter(isDefined);
const defaultProfileId = settingsInfoPart.initialState.defaultConfiguration;
- const selection = useTableSelection(profiles.map(p => p.id));
+ const selection = useTableSelection(profiles.filter(p => p.id !== defaultProfileId).map(p => p.id));
const table = useAIProfilesTable(selection);
return (
diff --git a/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesTable.tsx b/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesTable.tsx
index 1f2738a967..a3cb33e51b 100644
--- a/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesTable.tsx
+++ b/webapp/packages/plugin-ai-administration/src/AIProfiles/AIProfilesTable.tsx
@@ -51,8 +51,16 @@ export const AIProfilesTable = observer(function AIProfilesTable({ profil
return null;
}
+ const isDefault = profile.id === defaultProfileId;
+
if (column.key === SELECT_COLUMN.key) {
- return ;
+ return (
+
+ );
}
if (column.key === NAME_COLUMN.key) {
@@ -65,7 +73,7 @@ export const AIProfilesTable = observer(function AIProfilesTable({ profil
onClick={() => aiProfileFormService.open(profile.id, profile.name)}
>
{profile.name}
- {profile.id === defaultProfileId && (
+ {isDefault && (
{translate('plugin_ai_administration_profile_default_badge')}
)}
diff --git a/webapp/packages/plugin-ai-administration/src/locales/de.ts b/webapp/packages/plugin-ai-administration/src/locales/de.ts
index c1706f0b63..51b3cbcdc2 100644
--- a/webapp/packages/plugin-ai-administration/src/locales/de.ts
+++ b/webapp/packages/plugin-ai-administration/src/locales/de.ts
@@ -43,4 +43,10 @@ export default [
['plugin_ai_administration_profile_form_tab_options', 'Profil'],
['plugin_ai_administration_profile_name_max_length', 'Der Profilname darf {arg:length} Zeichen nicht überschreiten'],
['plugin_ai_administration_profile_name_min_length', 'Der Profilname muss mindestens {arg:length} Zeichen lang sein'],
+ [
+ 'plugin_ai_administration_profile_default_delete_info',
+ 'Das Standardprofil kann nicht gelöscht werden. Bitte wählen Sie ein anderes Profil als Standard aus, bevor Sie dieses Profil löschen.',
+ ],
+ ['plugin_ai_administration_profile_create', 'Neues Profil'],
+ ['plugin_ai_administration_profile_edit', 'Profil bearbeiten'],
];
diff --git a/webapp/packages/plugin-ai-administration/src/locales/en.ts b/webapp/packages/plugin-ai-administration/src/locales/en.ts
index 972e9b704c..62ecac58bd 100644
--- a/webapp/packages/plugin-ai-administration/src/locales/en.ts
+++ b/webapp/packages/plugin-ai-administration/src/locales/en.ts
@@ -43,4 +43,10 @@ export default [
['plugin_ai_administration_profile_form_tab_options', 'Profile'],
['plugin_ai_administration_profile_name_max_length', 'Profile name must not exceed {arg:length} characters'],
['plugin_ai_administration_profile_name_min_length', 'Profile name must be at least {arg:length} characters'],
+ [
+ 'plugin_ai_administration_profile_default_delete_info',
+ 'The default profile cannot be deleted. Please select another profile as the default before deleting this profile.',
+ ],
+ ['plugin_ai_administration_profile_create', 'New Profile'],
+ ['plugin_ai_administration_profile_edit', 'Edit Profile'],
];
diff --git a/webapp/packages/plugin-ai-administration/src/locales/fr.ts b/webapp/packages/plugin-ai-administration/src/locales/fr.ts
index 34872a4ff8..13787fd5b1 100644
--- a/webapp/packages/plugin-ai-administration/src/locales/fr.ts
+++ b/webapp/packages/plugin-ai-administration/src/locales/fr.ts
@@ -43,4 +43,10 @@ export default [
['plugin_ai_administration_profile_form_tab_options', 'Profil'],
['plugin_ai_administration_profile_name_max_length', 'Le nom du profil ne doit pas dépasser {arg:length} caractères'],
['plugin_ai_administration_profile_name_min_length', 'Le nom du profil doit contenir au moins {arg:length} caractères'],
+ [
+ 'plugin_ai_administration_profile_default_delete_info',
+ 'Le profil par défaut ne peut pas être supprimé. Veuillez sélectionner un autre profil comme profil par défaut avant de supprimer ce profil.',
+ ],
+ ['plugin_ai_administration_profile_create', 'Nouveau profil'],
+ ['plugin_ai_administration_profile_edit', 'Modifier le profil'],
];
diff --git a/webapp/packages/plugin-ai-administration/src/locales/ru.ts b/webapp/packages/plugin-ai-administration/src/locales/ru.ts
index f941d1aa0f..11eb9637ec 100644
--- a/webapp/packages/plugin-ai-administration/src/locales/ru.ts
+++ b/webapp/packages/plugin-ai-administration/src/locales/ru.ts
@@ -43,4 +43,10 @@ export default [
['plugin_ai_administration_profile_form_tab_options', 'Профиль'],
['plugin_ai_administration_profile_name_max_length', 'Название профиля не должно превышать {arg:length} символов'],
['plugin_ai_administration_profile_name_min_length', 'Название профиля должно содержать не менее {arg:length} символов'],
+ [
+ 'plugin_ai_administration_profile_default_delete_info',
+ 'Профиль по умолчанию нельзя удалить. Перед удалением этого профиля выберите другой профиль по умолчанию.',
+ ],
+ ['plugin_ai_administration_profile_create', 'Новый профиль'],
+ ['plugin_ai_administration_profile_edit', 'Редактировать профиль'],
];
diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.tsx
index de91f23469..e60c33e2f6 100644
--- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.tsx
+++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.tsx
@@ -1,6 +1,6 @@
/*
* CloudBeaver - Cloud Database Manager
- * Copyright (C) 2020-2024 DBeaver Corp and others
+ * Copyright (C) 2020-2026 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
@@ -13,6 +13,7 @@ import { Filter, Group, IconOrImage, Loader, s, useS, useTranslate } from '@clou
import styles from './UsersTableFilters.module.css';
import { UsersTableFiltersDetails } from './UsersTableFiltersDetails.js';
import { type IUserFilters } from './useUsersTableFilters.js';
+import { IconButton } from '@dbeaver/ui-kit';
interface Props {
filters: IUserFilters;
@@ -34,9 +35,14 @@ export const UsersTableFilters = observer(function UsersTableFilters({ fi
onChange={filters.setSearch}
/>
-
setOpen(!open)}>
+ setOpen(!open)}
+ >
-
+
diff --git a/webapp/packages/plugin-authentication-administration/src/locales/en.ts b/webapp/packages/plugin-authentication-administration/src/locales/en.ts
index cf4efd5149..8abadfe0df 100644
--- a/webapp/packages/plugin-authentication-administration/src/locales/en.ts
+++ b/webapp/packages/plugin-authentication-administration/src/locales/en.ts
@@ -35,6 +35,7 @@ export default [
['authentication_administration_users_filters_status_enabled', 'ENABLED'],
['authentication_administration_users_filters_status_disabled', 'DISABLED'],
['authentication_administration_users_filters_status_all', 'ALL'],
+ ['authentication_administration_users_filters_filter_label', 'Filter'],
['authentication_administration_users_empty', 'There are no users'],
['authentication_administration_users_delete_user', 'Delete user'],
['authentication_administration_users_delete_user_fail', 'Failed to delete user'],
diff --git a/webapp/packages/plugin-authentication-administration/src/locales/fr.ts b/webapp/packages/plugin-authentication-administration/src/locales/fr.ts
index acda50ea60..0a9e9766fc 100644
--- a/webapp/packages/plugin-authentication-administration/src/locales/fr.ts
+++ b/webapp/packages/plugin-authentication-administration/src/locales/fr.ts
@@ -35,6 +35,7 @@ export default [
['authentication_administration_users_filters_status_enabled', 'ACTIVÉ'],
['authentication_administration_users_filters_status_disabled', 'DÉSACTIVÉ'],
['authentication_administration_users_filters_status_all', 'TOUS'],
+ ['authentication_administration_users_filters_filter_label', 'Filter'],
['authentication_administration_users_empty', "Il n'y a pas d'utilisateurs"],
['authentication_administration_users_delete_user', "Supprimer l'utilisateur"],
['authentication_administration_users_delete_user_fail', "Échec de la suppression de l'utilisateur"],
diff --git a/webapp/packages/plugin-authentication-administration/src/locales/it.ts b/webapp/packages/plugin-authentication-administration/src/locales/it.ts
index 67b4ba1bf9..de87d2c4f9 100644
--- a/webapp/packages/plugin-authentication-administration/src/locales/it.ts
+++ b/webapp/packages/plugin-authentication-administration/src/locales/it.ts
@@ -31,6 +31,7 @@ export default [
['authentication_administration_users_filters_status_enabled', 'ENABLED'],
['authentication_administration_users_filters_status_disabled', 'DISABLED'],
['authentication_administration_users_filters_status_all', 'ALL'],
+ ['authentication_administration_users_filters_filter_label', 'Filter'],
['authentication_administration_users_empty', 'There are no users'],
['authentication_administration_users_delete_user', 'Delete user'],
['authentication_administration_users_delete_user_fail', 'Failed to delete user'],
diff --git a/webapp/packages/plugin-authentication-administration/src/locales/ru.ts b/webapp/packages/plugin-authentication-administration/src/locales/ru.ts
index 92f273d3da..0034d1e538 100644
--- a/webapp/packages/plugin-authentication-administration/src/locales/ru.ts
+++ b/webapp/packages/plugin-authentication-administration/src/locales/ru.ts
@@ -35,6 +35,7 @@ export default [
['authentication_administration_users_filters_status_enabled', 'ВКЛЮЧЕН'],
['authentication_administration_users_filters_status_disabled', 'ВЫКЛЮЧЕН'],
['authentication_administration_users_filters_status_all', 'ВСЕ'],
+ ['authentication_administration_users_filters_filter_label', 'Фильтр'],
['authentication_administration_users_empty', 'Нет пользователей'],
['authentication_administration_users_delete_user', 'Удалить пользователя'],
['authentication_administration_users_delete_user_fail', 'Не удалось удалить пользователя'],
diff --git a/webapp/packages/plugin-authentication-administration/src/locales/vi.ts b/webapp/packages/plugin-authentication-administration/src/locales/vi.ts
index b9330130b1..b7e44aabe0 100644
--- a/webapp/packages/plugin-authentication-administration/src/locales/vi.ts
+++ b/webapp/packages/plugin-authentication-administration/src/locales/vi.ts
@@ -35,6 +35,7 @@ export default [
['authentication_administration_users_filters_status_enabled', 'BẬT'],
['authentication_administration_users_filters_status_disabled', 'TẮT'],
['authentication_administration_users_filters_status_all', 'TẤT CẢ'],
+ ['authentication_administration_users_filters_filter_label', 'Filter'],
['authentication_administration_users_empty', 'Không có người dùng nào'],
['authentication_administration_users_delete_user', 'Xóa người dùng'],
['authentication_administration_users_delete_user_fail', 'Xóa người dùng thất bại'],
diff --git a/webapp/packages/plugin-authentication-administration/src/locales/zh.ts b/webapp/packages/plugin-authentication-administration/src/locales/zh.ts
index 3d16b47209..524fc3c479 100644
--- a/webapp/packages/plugin-authentication-administration/src/locales/zh.ts
+++ b/webapp/packages/plugin-authentication-administration/src/locales/zh.ts
@@ -34,6 +34,7 @@ export default [
['authentication_administration_users_filters_status_enabled', '启用'],
['authentication_administration_users_filters_status_disabled', '禁用'],
['authentication_administration_users_filters_status_all', '全部'],
+ ['authentication_administration_users_filters_filter_label', 'Filter'],
['authentication_administration_users_empty', '无用户'],
['authentication_administration_users_delete_user', '删除用户'],
['authentication_administration_users_delete_user_fail', '删除用户失败'],
diff --git a/webapp/packages/plugin-authentication/src/AuthenticationService.ts b/webapp/packages/plugin-authentication/src/AuthenticationService.ts
index d5db6fb7e3..a8e59ab428 100644
--- a/webapp/packages/plugin-authentication/src/AuthenticationService.ts
+++ b/webapp/packages/plugin-authentication/src/AuthenticationService.ts
@@ -1,6 +1,6 @@
/*
* CloudBeaver - Cloud Database Manager
- * Copyright (C) 2020-2025 DBeaver Corp and others
+ * Copyright (C) 2020-2026 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
@@ -125,11 +125,17 @@ export class AuthenticationService extends Bootstrap {
const redirectLinks = userLogoutInfo.redirectLinks;
if (redirectLinks.length) {
- const url = redirectLinks[0];
+ const redirectLink = redirectLinks[0]!;
+
+ if (redirectLink.sameTabRedirect) {
+ window.location.replace(redirectLink.url);
+ return;
+ }
+
const id = `okta-logout-id-${uuid()}`;
const popup = this.windowsService.open(id, {
- url,
+ url: redirectLink.url,
target: id,
width: 600,
height: 700,
diff --git a/webapp/packages/plugin-codemirror6/src/theme/base-code-editor-autocompletion.css b/webapp/packages/plugin-codemirror6/src/theme/base-code-editor-autocompletion.css
index f80a707396..bc7f2c7478 100644
--- a/webapp/packages/plugin-codemirror6/src/theme/base-code-editor-autocompletion.css
+++ b/webapp/packages/plugin-codemirror6/src/theme/base-code-editor-autocompletion.css
@@ -3,11 +3,19 @@
&.cm-tooltip-autocomplete {
& > ul {
border-radius: var(--theme-form-element-radius);
+ width: 320px;
}
& li {
display: flex;
align-items: center;
+ overflow: hidden;
+
+ & .cm-completionLabel {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
&:hover {
background: var(--theme-sub-secondary);
diff --git a/webapp/packages/plugin-data-export/package.json b/webapp/packages/plugin-data-export/package.json
index 25d791dab5..66b56ca825 100644
--- a/webapp/packages/plugin-data-export/package.json
+++ b/webapp/packages/plugin-data-export/package.json
@@ -38,6 +38,7 @@
"@cloudbeaver/plugin-data-viewer": "workspace:*",
"@cloudbeaver/plugin-navigation-tree": "workspace:*",
"@cloudbeaver/plugin-sql-editor": "workspace:*",
+ "@dbeaver/js-helpers": "workspace:*",
"mobx": "^6",
"mobx-react-lite": "^4",
"react": "^19",
diff --git a/webapp/packages/plugin-data-export/src/DataExportMenuService.ts b/webapp/packages/plugin-data-export/src/DataExportMenuService.ts
index d04c6abddd..2df3e42546 100644
--- a/webapp/packages/plugin-data-export/src/DataExportMenuService.ts
+++ b/webapp/packages/plugin-data-export/src/DataExportMenuService.ts
@@ -11,7 +11,7 @@ import { injectable } from '@cloudbeaver/core-di';
import { CommonDialogService } from '@cloudbeaver/core-dialogs';
import { LocalizationService } from '@cloudbeaver/core-localization';
import { DATA_CONTEXT_NAV_NODE, EObjectFeature } from '@cloudbeaver/core-navigation-tree';
-import { withTimestamp } from '@cloudbeaver/core-utils';
+import { withTimestamp } from '@dbeaver/js-helpers';
import { ACTION_EXPORT, ActionService, menuExtractItems, MenuService } from '@cloudbeaver/core-view';
import {
DATA_CONTEXT_DV_DDM,
diff --git a/webapp/packages/plugin-data-export/tsconfig.json b/webapp/packages/plugin-data-export/tsconfig.json
index b7ff6da332..5d34c6f85b 100644
--- a/webapp/packages/plugin-data-export/tsconfig.json
+++ b/webapp/packages/plugin-data-export/tsconfig.json
@@ -10,6 +10,9 @@
{
"path": "../../common-typescript/@dbeaver/cli"
},
+ {
+ "path": "../../common-typescript/@dbeaver/js-helpers"
+ },
{
"path": "../core-blocks"
},
diff --git a/webapp/packages/plugin-data-grid/src/TableRowSelect.tsx b/webapp/packages/plugin-data-grid/src/TableRowSelect.tsx
index a60fc2b649..496c439869 100644
--- a/webapp/packages/plugin-data-grid/src/TableRowSelect.tsx
+++ b/webapp/packages/plugin-data-grid/src/TableRowSelect.tsx
@@ -15,6 +15,7 @@ import { TableSelectionContext } from './TableSelectionContext.js';
interface BaseProps {
disabled?: boolean;
+ title?: string;
}
export interface ITableRowRootSelectProps extends BaseProps {
@@ -29,7 +30,7 @@ export interface ITableRowSelectProps extends BaseProps {
const CELL_CLASS_NAME = 'tw:flex tw:w-full tw:h-full tw:items-center tw:justify-center';
-export const TableRowSelect = observer
(function TableRowSelect({ isRoot, id, disabled }) {
+export const TableRowSelect = observer(function TableRowSelect({ isRoot, id, disabled, title }) {
const selection = use(TableSelectionContext);
const translate = useTranslate();
@@ -47,6 +48,7 @@ export const TableRowSelect = observer
@@ -234,6 +235,7 @@ export class DataGridContextMenuGenerateSqlService {
query,
nodeId: nodePathList,
nodeName: this.getEntityNameFromNodePath(nodePathList, model.name),
+ generatorId: createGenerator.id,
generatorName: createGenerator.label,
options: getDefaultQueryGeneratorOptions(),
regenerateQuery: genOptions => this.sqlGenerationResource.generateEntityQuery(createGenerator.id, nodePathList, genOptions),
diff --git a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataContentAction.ts b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataContentAction.ts
index 203e1da56a..81ebfb1844 100644
--- a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataContentAction.ts
+++ b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataContentAction.ts
@@ -1,6 +1,6 @@
/*
* CloudBeaver - Cloud Database Manager
- * Copyright (C) 2020-2025 DBeaver Corp and others
+ * Copyright (C) 2020-2026 DBeaver Corp and others
*
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
@@ -10,8 +10,8 @@ import { makeObservable, observable } from 'mobx';
import { QuotasService, ServerResourceQuotasResource } from '@cloudbeaver/core-root';
import { GraphQLService, ResultDataFormat } from '@cloudbeaver/core-sdk';
import { isResultSetContentValue } from '@dbeaver/result-set-api';
-import { bytesToSize, download, downloadFromURL, GlobalConstants } from '@cloudbeaver/core-utils';
-import { isNotNullDefined } from '@dbeaver/js-helpers';
+import { bytesToSize, downloadFromURL, GlobalConstants } from '@cloudbeaver/core-utils';
+import { download, isNotNullDefined } from '@dbeaver/js-helpers';
import { DatabaseDataAction } from '../../DatabaseDataAction.js';
import { IDatabaseDataSource } from '../../IDatabaseDataSource.js';
diff --git a/webapp/packages/plugin-data-viewer/src/ValuePanelPresentation/ImageValue/useValuePanelImageValue.ts b/webapp/packages/plugin-data-viewer/src/ValuePanelPresentation/ImageValue/useValuePanelImageValue.ts
index a91ba4b18f..ce2158caf5 100644
--- a/webapp/packages/plugin-data-viewer/src/ValuePanelPresentation/ImageValue/useValuePanelImageValue.ts
+++ b/webapp/packages/plugin-data-viewer/src/ValuePanelPresentation/ImageValue/useValuePanelImageValue.ts
@@ -12,7 +12,8 @@ import { promptForFiles } from '@cloudbeaver/core-browser';
import { ConnectionInfoResource, createConnectionParam } from '@cloudbeaver/core-connections';
import { useService } from '@cloudbeaver/core-di';
import { NotificationService } from '@cloudbeaver/core-events';
-import { download, getMIME, isImageFormat, isValidUrl } from '@cloudbeaver/core-utils';
+import { getMIME, isImageFormat, isValidUrl } from '@cloudbeaver/core-utils';
+import { download } from '@dbeaver/js-helpers';
import { isResultSetBinaryValue } from '@dbeaver/result-set-api';
import { createResultSetBlobValue } from '../../DatabaseDataModel/Actions/ResultSet/createResultSetBlobValue.js';
diff --git a/webapp/packages/plugin-ddl-viewer/package.json b/webapp/packages/plugin-ddl-viewer/package.json
index 8f882961a4..1925cc09b2 100644
--- a/webapp/packages/plugin-ddl-viewer/package.json
+++ b/webapp/packages/plugin-ddl-viewer/package.json
@@ -25,6 +25,8 @@
"@cloudbeaver/core-connections": "workspace:*",
"@cloudbeaver/core-data-context": "workspace:*",
"@cloudbeaver/core-di": "workspace:*",
+ "@cloudbeaver/core-events": "workspace:*",
+ "@cloudbeaver/core-localization": "workspace:*",
"@cloudbeaver/core-navigation-tree": "workspace:*",
"@cloudbeaver/core-resource": "workspace:*",
"@cloudbeaver/core-sdk": "workspace:*",
@@ -36,6 +38,8 @@
"@cloudbeaver/plugin-sql-editor": "workspace:*",
"@cloudbeaver/plugin-sql-editor-codemirror": "workspace:*",
"@cloudbeaver/plugin-sql-editor-navigation-tab": "workspace:*",
+ "@cloudbeaver/plugin-sql-generator": "workspace:*",
+ "@dbeaver/js-helpers": "workspace:*",
"mobx": "^6",
"mobx-react-lite": "^4",
"react": "^19",
diff --git a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/ACTION_DDL_VIEWER_FULL_DDL.ts b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/ACTION_DDL_VIEWER_FULL_DDL.ts
new file mode 100644
index 0000000000..40fb969bcf
--- /dev/null
+++ b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/ACTION_DDL_VIEWER_FULL_DDL.ts
@@ -0,0 +1,14 @@
+/*
+ * CloudBeaver - Cloud Database Manager
+ * Copyright (C) 2020-2026 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 { createAction } from '@cloudbeaver/core-view';
+
+export const ACTION_DDL_VIEWER_FULL_DDL = createAction('ddl-viewer-full-ddl', {
+ label: 'plugin_ddl_viewer_full_ddl',
+ tooltip: 'plugin_ddl_viewer_full_ddl',
+ type: 'checkbox',
+});
diff --git a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DATA_CONTEXT_DDL_VIEWER_VALUE.ts b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DATA_CONTEXT_DDL_VIEWER_QUERY.ts
similarity index 63%
rename from webapp/packages/plugin-ddl-viewer/src/DdlViewer/DATA_CONTEXT_DDL_VIEWER_VALUE.ts
rename to webapp/packages/plugin-ddl-viewer/src/DdlViewer/DATA_CONTEXT_DDL_VIEWER_QUERY.ts
index ac2e51d766..caa900ab7a 100644
--- a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DATA_CONTEXT_DDL_VIEWER_VALUE.ts
+++ b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DATA_CONTEXT_DDL_VIEWER_QUERY.ts
@@ -1,10 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
- * Copyright (C) 2020-2024 DBeaver Corp and others
+ * Copyright (C) 2020-2026 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 { createDataContext } from '@cloudbeaver/core-data-context';
-export const DATA_CONTEXT_DDL_VIEWER_VALUE = createDataContext('ddl-value');
+export const DATA_CONTEXT_DDL_VIEWER_QUERY = createDataContext('ddl-query');
diff --git a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerFooterService.ts b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerFooterService.ts
index 8e4ead0170..6dcf8cb2c5 100644
--- a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerFooterService.ts
+++ b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerFooterService.ts
@@ -1,42 +1,69 @@
/*
* CloudBeaver - Cloud Database Manager
- * Copyright (C) 2020-2025 DBeaver Corp and others
+ * Copyright (C) 2020-2026 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 { ConnectionInfoResource, createConnectionParam } from '@cloudbeaver/core-connections';
import { injectable } from '@cloudbeaver/core-di';
-import { NavNodeManagerService } from '@cloudbeaver/core-navigation-tree';
-import { download, withTimestamp } from '@cloudbeaver/core-utils';
+import { EObjectFeature, NavNodeInfoResource, NavNodeManagerService } from '@cloudbeaver/core-navigation-tree';
+import { MetadataMap } from '@cloudbeaver/core-utils';
+import { download, withTimestamp } from '@dbeaver/js-helpers';
import { ACTION_SAVE, ActionService, MenuService } from '@cloudbeaver/core-view';
+import { DDL_GENERATOR_ID, SqlGeneratorsResource } from '@cloudbeaver/plugin-sql-generator';
import { LocalStorageSqlDataSource } from '@cloudbeaver/plugin-sql-editor';
import { ACTION_SQL_EDITOR_OPEN, SqlEditorNavigatorService } from '@cloudbeaver/plugin-sql-editor-navigation-tab';
+import { ACTION_DDL_VIEWER_FULL_DDL } from './ACTION_DDL_VIEWER_FULL_DDL.js';
import { DATA_CONTEXT_DDL_VIEWER_NODE } from './DATA_CONTEXT_DDL_VIEWER_NODE.js';
-import { DATA_CONTEXT_DDL_VIEWER_VALUE } from './DATA_CONTEXT_DDL_VIEWER_VALUE.js';
+import { DATA_CONTEXT_DDL_VIEWER_QUERY } from './DATA_CONTEXT_DDL_VIEWER_QUERY.js';
import { MENU_DDL_VIEWER_FOOTER } from './MENU_DDL_VIEWER_FOOTER.js';
-@injectable(() => [NavNodeManagerService, ActionService, MenuService, SqlEditorNavigatorService, ConnectionInfoResource])
+@injectable(() => [
+ NavNodeManagerService,
+ ActionService,
+ MenuService,
+ SqlEditorNavigatorService,
+ ConnectionInfoResource,
+ NavNodeInfoResource,
+ SqlGeneratorsResource,
+])
export class DDLViewerFooterService {
+ private readonly fullDdlState = new MetadataMap(() => false);
+
constructor(
private readonly navNodeManagerService: NavNodeManagerService,
private readonly actionsService: ActionService,
private readonly menuService: MenuService,
private readonly sqlEditorNavigatorService: SqlEditorNavigatorService,
private readonly connectionInfoResource: ConnectionInfoResource,
+ private readonly navNodeInfoResource: NavNodeInfoResource,
+ private readonly sqlGeneratorsResource: SqlGeneratorsResource,
) {}
+ isFullDdlEnabled(nodeId: string): boolean {
+ return this.fullDdlState.get(nodeId);
+ }
+
+ setFullDdlEnabled(nodeId: string, value: boolean): void {
+ this.fullDdlState.set(nodeId, value);
+ }
+
+ toggleFullDdl(nodeId: string): void {
+ this.setFullDdlEnabled(nodeId, !this.isFullDdlEnabled(nodeId));
+ }
+
register(): void {
this.actionsService.addHandler({
id: 'ddl-viewer-footer-base-handler',
menus: [MENU_DDL_VIEWER_FOOTER],
- contexts: [DATA_CONTEXT_DDL_VIEWER_NODE, DATA_CONTEXT_DDL_VIEWER_VALUE],
+ contexts: [DATA_CONTEXT_DDL_VIEWER_NODE, DATA_CONTEXT_DDL_VIEWER_QUERY],
actions: [ACTION_SAVE, ACTION_SQL_EDITOR_OPEN],
handler: async (context, action) => {
switch (action) {
case ACTION_SAVE: {
- const ddl = context.get(DATA_CONTEXT_DDL_VIEWER_VALUE)!;
+ const ddl = context.get(DATA_CONTEXT_DDL_VIEWER_QUERY)!;
const nodeId = context.get(DATA_CONTEXT_DDL_VIEWER_NODE);
const blob = new Blob([ddl], {
@@ -50,7 +77,7 @@ export class DDLViewerFooterService {
break;
}
case ACTION_SQL_EDITOR_OPEN: {
- const ddl = context.get(DATA_CONTEXT_DDL_VIEWER_VALUE)!;
+ const ddl = context.get(DATA_CONTEXT_DDL_VIEWER_QUERY)!;
const nodeId = context.get(DATA_CONTEXT_DDL_VIEWER_NODE)!;
const connection = this.connectionInfoResource.getConnectionForNode(nodeId);
@@ -92,5 +119,34 @@ export class DDLViewerFooterService {
menus: [MENU_DDL_VIEWER_FOOTER],
getItems: (context, items) => [...items, ACTION_SAVE, ACTION_SQL_EDITOR_OPEN],
});
+
+ this.menuService.addCreator({
+ menus: [MENU_DDL_VIEWER_FOOTER],
+ contexts: [DATA_CONTEXT_DDL_VIEWER_NODE],
+ isApplicable: context => this.isFullDDLSupported(context.get(DATA_CONTEXT_DDL_VIEWER_NODE)!),
+ getItems: (context, items) => [...items, ACTION_DDL_VIEWER_FULL_DDL],
+ });
+
+ this.actionsService.addHandler({
+ id: 'ddl-viewer-footer-full-ddl-handler',
+ menus: [MENU_DDL_VIEWER_FOOTER],
+ actions: [ACTION_DDL_VIEWER_FULL_DDL],
+ contexts: [DATA_CONTEXT_DDL_VIEWER_NODE],
+ isChecked: context => this.isFullDdlEnabled(context.get(DATA_CONTEXT_DDL_VIEWER_NODE)!),
+ handler: (context, action) => {
+ if (action === ACTION_DDL_VIEWER_FULL_DDL) {
+ this.toggleFullDdl(context.get(DATA_CONTEXT_DDL_VIEWER_NODE)!);
+ }
+ },
+ });
+ }
+
+ private isFullDDLSupported(nodeId: string): boolean {
+ const supportsFullDdl = this.navNodeInfoResource.get(nodeId)?.objectFeatures.includes(EObjectFeature.supportsFullDdl) ?? false;
+ const ddlGenerator = this.sqlGeneratorsResource
+ .get(nodeId)
+ ?.find(generator => generator.id.toLowerCase().includes(DDL_GENERATOR_ID.toLowerCase()));
+
+ return supportsFullDdl && !!ddlGenerator;
}
}
diff --git a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerTabPanel.tsx b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerTabPanel.tsx
index 716f93861c..7eedf48bdf 100644
--- a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerTabPanel.tsx
+++ b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DDLViewerTabPanel.tsx
@@ -7,7 +7,7 @@
*/
import { observer } from 'mobx-react-lite';
-import { s, useResource, useS } from '@cloudbeaver/core-blocks';
+import { s, useAutoLoad, useResource, useS } from '@cloudbeaver/core-blocks';
import {
ConnectionDialectResource,
ConnectionInfoActiveProjectKey,
@@ -22,17 +22,15 @@ import type { NavNodeTransformViewComponent } from '@cloudbeaver/plugin-navigati
import { SQLCodeEditor, useSqlDialectExtension } from '@cloudbeaver/plugin-sql-editor-codemirror';
import { DATA_CONTEXT_DDL_VIEWER_NODE } from './DATA_CONTEXT_DDL_VIEWER_NODE.js';
-import { DATA_CONTEXT_DDL_VIEWER_VALUE } from './DATA_CONTEXT_DDL_VIEWER_VALUE.js';
-import { DdlResource } from './DdlResource.js';
+import { DATA_CONTEXT_DDL_VIEWER_QUERY } from './DATA_CONTEXT_DDL_VIEWER_QUERY.js';
import style from './DDLViewerTabPanel.module.css';
import { MENU_DDL_VIEWER_FOOTER } from './MENU_DDL_VIEWER_FOOTER.js';
+import { useDdlEntityQuery } from './useDdlEntityQuery.js';
export const DDLViewerTabPanel: NavNodeTransformViewComponent = observer(function DDLViewerTabPanel({ nodeId, folderId }) {
const styles = useS(style, MenuBarStyles, MenuBarItemStyles, MenuBarGroupStyles);
const menu = useMenu({ menu: MENU_DDL_VIEWER_FOOTER });
- const ddlResource = useResource(DDLViewerTabPanel, DdlResource, nodeId);
-
const connectionInfoResource = useResource(DDLViewerTabPanel, ConnectionInfoResource, ConnectionInfoActiveProjectKey);
const connection = connectionInfoResource.resource.getConnectionForNode(nodeId);
const connectionParam = connection ? createConnectionParam(connection) : null;
@@ -42,16 +40,21 @@ export const DDLViewerTabPanel: NavNodeTransformViewComponent = observer(functio
if (sqlDialect) {
extensions.set(...sqlDialect);
}
- const ddlData = ddlResource.data;
+
+ const ddlQueryState = useDdlEntityQuery(nodeId);
+
+ useAutoLoad(DDLViewerTabPanel, ddlQueryState);
+
+ const query = ddlQueryState.query ?? '';
useDataContextLink(menu.context, (context, id) => {
context.set(DATA_CONTEXT_DDL_VIEWER_NODE, nodeId, id);
- context.set(DATA_CONTEXT_DDL_VIEWER_VALUE, ddlData, id);
+ context.set(DATA_CONTEXT_DDL_VIEWER_QUERY, query, id);
});
return (
-
+
);
diff --git a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DdlResource.ts b/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DdlResource.ts
deleted file mode 100644
index c6a8ecb43a..0000000000
--- a/webapp/packages/plugin-ddl-viewer/src/DdlViewer/DdlResource.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * CloudBeaver - Cloud Database Manager
- * Copyright (C) 2020-2024 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 '@cloudbeaver/core-di';
-import { NavNodeInfoResource } from '@cloudbeaver/core-navigation-tree';
-import { CachedMapResource, isResourceAlias, type ResourceKey, ResourceKeyUtils } from '@cloudbeaver/core-resource';
-import { GraphQLService } from '@cloudbeaver/core-sdk';
-
-@injectable(() => [GraphQLService, NavNodeInfoResource])
-export class DdlResource extends CachedMapResource {
- constructor(
- private readonly graphQLService: GraphQLService,
- private readonly navNodeInfoResource: NavNodeInfoResource,
- ) {
- super();
-
- this.navNodeInfoResource.outdateResource(this);
- this.navNodeInfoResource.deleteInResource(this);
- }
-
- protected async loader(key: ResourceKey): Promise
diff --git a/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsBootstrap.ts b/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsBootstrap.ts
index ee4d5385de..c24631afcb 100644
--- a/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsBootstrap.ts
+++ b/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsBootstrap.ts
@@ -12,8 +12,8 @@ import { DATA_CONTEXT_NAV_NODE, EObjectFeature } from '@cloudbeaver/core-navigat
import { getCachedMapResourceLoaderState } from '@cloudbeaver/core-resource';
import { MenuBaseItem, MenuService } from '@cloudbeaver/core-view';
-import { MENU_SQL_GENERATORS } from './MENU_SQL_GENERATORS.js';
import { getDefaultQueryGeneratorOptions, SqlGeneratorsResource } from './SqlGeneratorsResource.js';
+import { MENU_SQL_GENERATORS } from './MENU_SQL_GENERATORS.js';
import { NotificationService } from '@cloudbeaver/core-events';
const GeneratedSqlDialog = importLazyComponent(() => import('./GeneratedSqlDialog.js').then(m => m.GeneratedSqlDialog));
@@ -86,6 +86,7 @@ export class SqlGeneratorsBootstrap extends Bootstrap {
query,
nodeId: node.uri,
nodeName: node.name,
+ generatorId: action.id,
generatorName: action.label,
options: getDefaultQueryGeneratorOptions(),
regenerateQuery: options => this.sqlGeneratorsResource.generateEntityQuery(action.id, node.uri, options),
diff --git a/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts b/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts
index 95eaf63a12..a712535ef0 100644
--- a/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts
+++ b/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts
@@ -8,6 +8,7 @@
import { injectable } from '@cloudbeaver/core-di';
import { NavNodeInfoResource } from '@cloudbeaver/core-navigation-tree';
import { CachedMapResource, isResourceAlias, type ResourceKey, resourceKeyList, ResourceKeyUtils } from '@cloudbeaver/core-resource';
+import { AsyncTaskInfoService } from '@cloudbeaver/core-root';
import {
GraphQLService,
type SqlGenerateResultSetQueryQueryVariables,
@@ -19,13 +20,15 @@ export const MAX_GENERATORS_LENGTH = 15;
export const getDefaultQueryGeneratorOptions = (): SqlQueryGeneratorOptions => ({
useFullyQualifiedNames: true,
compactSql: false,
+ showFullDdl: false,
});
export const DDL_GENERATOR_ID = 'tableDDL';
-@injectable(() => [GraphQLService, NavNodeInfoResource])
+@injectable(() => [GraphQLService, AsyncTaskInfoService, NavNodeInfoResource])
export class SqlGeneratorsResource extends CachedMapResource {
constructor(
private readonly graphQLService: GraphQLService,
+ private readonly asyncTaskInfoService: AsyncTaskInfoService,
private readonly navNodeInfoResource: NavNodeInfoResource,
) {
super();
@@ -35,13 +38,20 @@ export class SqlGeneratorsResource extends CachedMapResource {
- const result = await this.graphQLService.sdk.sqlGenerateEntityQuery({
- generatorId,
- nodePathList,
- generatorOptions: options,
+ const task = this.asyncTaskInfoService.create(async () => {
+ const { taskInfo } = await this.graphQLService.sdk.asyncSqlGenerateEntityQuery({
+ generatorId,
+ nodePathList,
+ generatorOptions: options,
+ });
+
+ return taskInfo;
});
- return result.sqlGenerateEntityQuery;
+ const info = await this.asyncTaskInfoService.run(task);
+ await this.asyncTaskInfoService.remove(task.id);
+
+ return info.taskResult;
}
async generateResultSetSql(params: SqlGenerateResultSetQueryQueryVariables): Promise {
diff --git a/webapp/packages/plugin-sql-generator/src/locales/en.ts b/webapp/packages/plugin-sql-generator/src/locales/en.ts
index ee34546328..48c468ac3e 100644
--- a/webapp/packages/plugin-sql-generator/src/locales/en.ts
+++ b/webapp/packages/plugin-sql-generator/src/locales/en.ts
@@ -2,6 +2,7 @@ export default [
['app_shared_sql_generators_error_title', 'SQL Generation Error'],
['app_shared_sql_generators_use_fully_qualified_names', 'Use fully qualified names'],
['app_shared_sql_generators_compact_sql', 'Compact SQL'],
+ ['app_shared_sql_generators_full_ddl', 'Full DDL'],
['app_shared_sql_generators_open_in_editor', 'Open in SQL Editor'],
['app_shared_sql_generators_error_open_editor', 'Error opening SQL Editor'],
];
diff --git a/webapp/packages/plugin-sql-generator/src/locales/fr.ts b/webapp/packages/plugin-sql-generator/src/locales/fr.ts
index b1877ca2c7..326376d22d 100644
--- a/webapp/packages/plugin-sql-generator/src/locales/fr.ts
+++ b/webapp/packages/plugin-sql-generator/src/locales/fr.ts
@@ -2,6 +2,7 @@ export default [
['app_shared_sql_generators_error_title', 'Erreur de génération SQL'],
['app_shared_sql_generators_use_fully_qualified_names', 'Utiliser les noms complets'],
['app_shared_sql_generators_compact_sql', 'SQL compact'],
+ ['app_shared_sql_generators_full_ddl', 'Full DDL'],
['app_shared_sql_generators_open_in_editor', "Ouvrir dans l'éditeur SQL"],
['app_shared_sql_generators_error_open_editor', "Erreur lors de l'ouverture de l'éditeur SQL"],
];
diff --git a/webapp/packages/plugin-sql-generator/src/locales/it.ts b/webapp/packages/plugin-sql-generator/src/locales/it.ts
index b980aadd5a..50176cbdfc 100644
--- a/webapp/packages/plugin-sql-generator/src/locales/it.ts
+++ b/webapp/packages/plugin-sql-generator/src/locales/it.ts
@@ -2,6 +2,7 @@ export default [
['app_shared_sql_generators_error_title', 'Errore di generazione SQL'],
['app_shared_sql_generators_use_fully_qualified_names', 'Usa nomi completi'],
['app_shared_sql_generators_compact_sql', 'SQL compatto'],
+ ['app_shared_sql_generators_full_ddl', 'Full DDL'],
['app_shared_sql_generators_open_in_editor', "Apri nell'editor SQL"],
['app_shared_sql_generators_error_open_editor', "Errore durante l'apertura dell'editor SQL"],
];
diff --git a/webapp/packages/plugin-sql-generator/src/locales/ru.ts b/webapp/packages/plugin-sql-generator/src/locales/ru.ts
index 8a44f1cefb..643f6c438e 100644
--- a/webapp/packages/plugin-sql-generator/src/locales/ru.ts
+++ b/webapp/packages/plugin-sql-generator/src/locales/ru.ts
@@ -2,6 +2,7 @@ export default [
['app_shared_sql_generators_error_title', 'Ошибка генерации SQL'],
['app_shared_sql_generators_use_fully_qualified_names', 'Использовать полные имена'],
['app_shared_sql_generators_compact_sql', 'Компактный SQL'],
+ ['app_shared_sql_generators_full_ddl', 'Полный DDL'],
['app_shared_sql_generators_open_in_editor', 'Открыть в SQL редакторе'],
['app_shared_sql_generators_error_open_editor', 'Ошибка при открытии SQL редактора'],
];
diff --git a/webapp/packages/plugin-sql-generator/src/locales/vi.ts b/webapp/packages/plugin-sql-generator/src/locales/vi.ts
index 41cbd4a09c..454f389678 100644
--- a/webapp/packages/plugin-sql-generator/src/locales/vi.ts
+++ b/webapp/packages/plugin-sql-generator/src/locales/vi.ts
@@ -2,6 +2,7 @@ export default [
['app_shared_sql_generators_error_title', 'Lỗi tạo SQL'],
['app_shared_sql_generators_use_fully_qualified_names', 'Sử dụng tên đầy đủ'],
['app_shared_sql_generators_compact_sql', 'SQL gọn'],
+ ['app_shared_sql_generators_full_ddl', 'Full DDL'],
['app_shared_sql_generators_open_in_editor', 'Mở trong trình soạn thảo SQL'],
['app_shared_sql_generators_error_open_editor', 'Lỗi khi mở trình soạn thảo SQL'],
];
diff --git a/webapp/packages/plugin-sql-generator/src/locales/zh.ts b/webapp/packages/plugin-sql-generator/src/locales/zh.ts
index e40f345c8c..0eee5fc34e 100644
--- a/webapp/packages/plugin-sql-generator/src/locales/zh.ts
+++ b/webapp/packages/plugin-sql-generator/src/locales/zh.ts
@@ -2,6 +2,7 @@ export default [
['app_shared_sql_generators_error_title', 'SQL生成错误'],
['app_shared_sql_generators_use_fully_qualified_names', '使用完全限定名'],
['app_shared_sql_generators_compact_sql', '紧凑SQL'],
+ ['app_shared_sql_generators_full_ddl', 'Full DDL'],
['app_shared_sql_generators_open_in_editor', '在SQL编辑器中打开'],
['app_shared_sql_generators_error_open_editor', '打开SQL编辑器时出错'],
];
diff --git a/webapp/packages/plugin-sql-generator/tsconfig.json b/webapp/packages/plugin-sql-generator/tsconfig.json
index b13d67548a..c7229863bd 100644
--- a/webapp/packages/plugin-sql-generator/tsconfig.json
+++ b/webapp/packages/plugin-sql-generator/tsconfig.json
@@ -10,6 +10,9 @@
{
"path": "../../common-typescript/@dbeaver/cli"
},
+ {
+ "path": "../../common-typescript/@dbeaver/js-helpers"
+ },
{
"path": "../core-blocks"
},
@@ -37,6 +40,9 @@
{
"path": "../core-resource"
},
+ {
+ "path": "../core-root"
+ },
{
"path": "../core-sdk"
},
diff --git a/webapp/yarn.lock b/webapp/yarn.lock
index e15e10472b..fc9976dce3 100644
--- a/webapp/yarn.lock
+++ b/webapp/yarn.lock
@@ -3110,6 +3110,7 @@ __metadata:
"@cloudbeaver/plugin-sql-editor": "workspace:*"
"@cloudbeaver/tsconfig": "workspace:*"
"@dbeaver/cli": "workspace:*"
+ "@dbeaver/js-helpers": "workspace:*"
"@types/react": "npm:^19"
mobx: "npm:^6"
mobx-react-lite: "npm:^4"
@@ -3503,6 +3504,8 @@ __metadata:
"@cloudbeaver/core-connections": "workspace:*"
"@cloudbeaver/core-data-context": "workspace:*"
"@cloudbeaver/core-di": "workspace:*"
+ "@cloudbeaver/core-events": "workspace:*"
+ "@cloudbeaver/core-localization": "workspace:*"
"@cloudbeaver/core-navigation-tree": "workspace:*"
"@cloudbeaver/core-resource": "workspace:*"
"@cloudbeaver/core-sdk": "workspace:*"
@@ -3514,7 +3517,9 @@ __metadata:
"@cloudbeaver/plugin-sql-editor": "workspace:*"
"@cloudbeaver/plugin-sql-editor-codemirror": "workspace:*"
"@cloudbeaver/plugin-sql-editor-navigation-tab": "workspace:*"
+ "@cloudbeaver/plugin-sql-generator": "workspace:*"
"@cloudbeaver/tsconfig": "workspace:*"
+ "@dbeaver/js-helpers": "workspace:*"
"@types/react": "npm:^19"
mobx: "npm:^6"
mobx-react-lite: "npm:^4"
@@ -4717,6 +4722,7 @@ __metadata:
"@cloudbeaver/core-localization": "workspace:*"
"@cloudbeaver/core-navigation-tree": "workspace:*"
"@cloudbeaver/core-resource": "workspace:*"
+ "@cloudbeaver/core-root": "workspace:*"
"@cloudbeaver/core-sdk": "workspace:*"
"@cloudbeaver/core-utils": "workspace:*"
"@cloudbeaver/core-view": "workspace:*"
@@ -4727,6 +4733,7 @@ __metadata:
"@cloudbeaver/plugin-sql-editor-navigation-tab": "workspace:*"
"@cloudbeaver/tsconfig": "workspace:*"
"@dbeaver/cli": "workspace:*"
+ "@dbeaver/js-helpers": "workspace:*"
"@types/react": "npm:^19"
mobx: "npm:^6"
mobx-react-lite: "npm:^4"
@@ -5363,6 +5370,7 @@ __metadata:
"@dbeaver/tsconfig": "workspace:^"
async-mutex: "npm:^0"
color: "npm:^5.0.2"
+ modern-screenshot: "npm:^4"
p-debounce: "npm:^5"
p-memoize: "npm:^8.0.0"
quick-lru: "npm:^7.1.0"
@@ -10508,12 +10516,12 @@ __metadata:
languageName: node
linkType: hard
-"brace-expansion@npm:>=5.0.8":
- version: 5.0.8
- resolution: "brace-expansion@npm:5.0.8"
+"brace-expansion@npm:>=5.0.9":
+ version: 5.0.9
+ resolution: "brace-expansion@npm:5.0.9"
dependencies:
balanced-match: "npm:^4.0.2"
- checksum: 10c0/73304caafd00fdc5b0168e693ac15bf25b6357dec76d1195fcd628fe2cf99c46f9c889a7ecfa3cfe236dbd2d5ce3e27a6ccc4370b46d475d0d19081e11f86019
+ checksum: 10c0/3dea38884a1c3c8b1c9c44a7402a0c76fca460f70cffb3127242b0b4cbf4472019e022ade021eec44838ff19f1dac2625dfd11dd459d7e1e055b0698a8d52fec
languageName: node
linkType: hard
@@ -12910,10 +12918,10 @@ __metadata:
languageName: node
linkType: hard
-"fast-uri@npm:>3.1.3":
- version: 4.1.1
- resolution: "fast-uri@npm:4.1.1"
- checksum: 10c0/669e12d1e7c3ba931b93d94def9a0a7352288503f09479f62e31b7bd731fe73f9b62ff411724e2d452c39a57d756cdce4169ea6d1b80424c2c254c1eecde10e5
+"fast-uri@npm:>=4.1.2":
+ version: 4.1.2
+ resolution: "fast-uri@npm:4.1.2"
+ checksum: 10c0/539fda19fbc7ada89ac8c5beca3c7ab57d643789485ca25f2b88f94edaea3fc90d553ecd55d85b95d5c819ab2bf57f6ff7880aa0a92d0883e25bd35f30860e6a
languageName: node
linkType: hard
@@ -16099,6 +16107,13 @@ __metadata:
languageName: node
linkType: hard
+"modern-screenshot@npm:^4":
+ version: 4.7.0
+ resolution: "modern-screenshot@npm:4.7.0"
+ checksum: 10c0/9c5fbe4f4c73d3dcf0ba7fb76c1671ad148fdedffc84700e0b8ca1c1640a6ab1930718ae1424b0a6517b98d8f18c898ea0e62ee0ca57a25bfce7b914df721a63
+ languageName: node
+ linkType: hard
+
"ms@npm:^2.1.3":
version: 2.1.3
resolution: "ms@npm:2.1.3"
@@ -19521,10 +19536,10 @@ __metadata:
languageName: node
linkType: hard
-"undici@npm:>=6.27.0":
- version: 8.5.0
- resolution: "undici@npm:8.5.0"
- checksum: 10c0/7c25fd96a4dcc607b905995f6feec948f74a6759cadbea4c6eb9402517aab4887987c8001c80d482297d04f975f44a383325b89577ac21e587983ed088408065
+"undici@npm:>=8.9.0":
+ version: 8.10.0
+ resolution: "undici@npm:8.10.0"
+ checksum: 10c0/37ae2b1db8f65c3a003504e2040e96887b99f9db16ba07dcf49c37ed8b7f8c72f4452f2d46f52f7c9e49518fe8325e3b5e7e02ac3a2424886bd67d4b62a0ecab
languageName: node
linkType: hard