From 170650e6c236e8e4d700243a6739a79787230a5a Mon Sep 17 00:00:00 2001 From: alex <48489896+devnaumov@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:34:22 +0200 Subject: [PATCH 1/9] dbeaver/pro#4711 support uploadable textarea (#4522) Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com> Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com> --- .../ObjectPropertyInfoForm/RenderField.tsx | 45 ++++++++++++++++++- .../core-sdk/src/getObjectPropertyType.ts | 10 +++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/webapp/packages/core-blocks/src/ObjectPropertyInfo/ObjectPropertyInfoForm/RenderField.tsx b/webapp/packages/core-blocks/src/ObjectPropertyInfo/ObjectPropertyInfoForm/RenderField.tsx index 44abc5dd6b..1ac0a137a4 100644 --- a/webapp/packages/core-blocks/src/ObjectPropertyInfo/ObjectPropertyInfoForm/RenderField.tsx +++ b/webapp/packages/core-blocks/src/ObjectPropertyInfo/ObjectPropertyInfoForm/RenderField.tsx @@ -17,7 +17,8 @@ import { getObjectPropertyValueType, type IObjectPropertyInfo, } from '@cloudbeaver/core-sdk'; -import { EMPTY_ARRAY, removeMetadataFromDataURL } from '@cloudbeaver/core-utils'; +import { EMPTY_ARRAY, getTextFileReadingProcess, removeMetadataFromDataURL } from '@cloudbeaver/core-utils'; +import { clsx } from '@dbeaver/ui-kit'; import { FieldCheckbox } from '../../FormControls/Checkboxes/FieldCheckbox.js'; import { Select } from '../../FormControls/Select.js'; @@ -30,6 +31,8 @@ import { Link } from '../../Link.js'; import { useTranslate } from '../../localization/useTranslate.js'; import { evaluate } from '../evaluate.js'; import { SAVED_VALUE_INDICATOR } from '../../SAVED_VALUE_INDICATOR.js'; +import { UploadArea } from '../../UploadArea.js'; +import { Button } from '../../Button.js'; interface RenderFieldProps { property: IObjectPropertyInfo; @@ -204,6 +207,46 @@ export const RenderField = observer(function RenderField({ ); } + if (controlType === 'uploadable-textarea' && state && property.id) { + async function handleFileUpload(event: React.ChangeEvent) { + const file = event.target.files?.[0]; + + if (!file) { + throw new Error('File is not found'); + } + + const process = getTextFileReadingProcess(file); + const result = await process.promise; + + if (state && property.id) { + state[property.id] = result; + } + } + + return ( +
+ + + + +
+ ); + } + if (controlType === 'file' && state) { return ( Date: Tue, 11 Aug 2026 12:29:14 +0200 Subject: [PATCH 2/9] dbeaver/pro#9981 adds export button for admin users page (#4531) * dbeaver/pro#9981 adds export button for admin users page * dbeaver/pro#9981 uses fetch to download csv instead of submitForm approach (backend issue) * dbeaver/pro#9981 makes users export to be available only for PRO products * dbeaver/pro#9981 reverts export logic * dbeaver/pro#9981 add actionButtonsPlaceholder * dbeaver/pro#9981 cleanup --------- Co-authored-by: Evgenia <139753579+EvgeniaBzzz@users.noreply.github.com> --- .../Users/UsersAdministrationService.ts | 15 +++++++- .../Filters/FiltersActionButton.tsx | 29 ++++++++++++++ .../Filters/UsersTableFilterButton.tsx | 32 ++++++++++++++++ .../Filters/UsersTableFilters.module.css | 38 ++----------------- .../UsersTable/Filters/UsersTableFilters.tsx | 22 +++++------ .../Filters/UsersTableFiltersOpenContext.ts | 15 ++++++++ .../src/index.ts | 2 + 7 files changed, 106 insertions(+), 47 deletions(-) create mode 100644 webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/FiltersActionButton.tsx create mode 100644 webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilterButton.tsx create mode 100644 webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFiltersOpenContext.ts diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts index 1d4c373e2a..eae553f07f 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.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. @@ -17,6 +17,7 @@ import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dial import { CreateTeamService } from './Teams/TeamsTable/CreateTeamService.js'; import { EUsersAdministrationSub, UsersAdministrationNavigationService } from './UsersAdministrationNavigationService.js'; import { CreateUserService } from './UsersTable/CreateUserService.js'; +import type { IUserFilters } from './UsersTable/Filters/useUsersTableFilters.js'; const UserCredentialsList = React.lazy(async () => { const { UserCredentialsList } = await import('./UsersTable/UserCredentialsList.js'); @@ -33,15 +34,25 @@ const UsersAdministration = React.lazy(async () => { return { default: UsersAdministration }; }); +const UsersTableFilterButton = React.lazy(async () => { + const { UsersTableFilterButton } = await import('./UsersTable/Filters/UsersTableFilterButton.js'); + return { default: UsersTableFilterButton }; +}); + export interface IUserDetailsInfoProps { user: AdminUser; } +export interface IUsersActionButtonProps { + filters: IUserFilters; +} + @injectable(() => [AdministrationItemService, CreateUserService, TeamsResource, CreateTeamService, UsersResource, CommonDialogService]) export class UsersAdministrationService extends Bootstrap { readonly tabsContainer: TabsContainer; readonly userDetailsInfoPlaceholder: PlaceholderContainer; readonly informationPlaceholder: PlaceholderContainer; + readonly actionButtonsPlaceholder: PlaceholderContainer; administrationItem!: IAdministrationItem; constructor( @@ -56,6 +67,7 @@ export class UsersAdministrationService extends Bootstrap { this.userDetailsInfoPlaceholder = new PlaceholderContainer(); this.tabsContainer = new TabsContainer('Access Control'); this.informationPlaceholder = new PlaceholderContainer(); + this.actionButtonsPlaceholder = new PlaceholderContainer(); } override register(): void { @@ -83,6 +95,7 @@ export class UsersAdministrationService extends Bootstrap { getDrawerComponent: () => UsersDrawerItem, }); this.userDetailsInfoPlaceholder.add(UserCredentialsList, 0); + this.actionButtonsPlaceholder.add(UsersTableFilterButton, 0); } private async handleDeactivate(sub: EUsersAdministrationSub) { diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/FiltersActionButton.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/FiltersActionButton.tsx new file mode 100644 index 0000000000..129f013b98 --- /dev/null +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/FiltersActionButton.tsx @@ -0,0 +1,29 @@ +/* + * 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 { observer } from 'mobx-react-lite'; + +import { clsx, IconButton, type IconButtonProps } from '@dbeaver/ui-kit'; + +const BUTTON_BOX_CLASS_NAME = clsx( + 'theme-form-element-radius theme-background-surface theme-text-on-surface theme theme-border-color-background', + 'tw:flex tw:items-center tw:justify-center tw:box-border tw:h-8 tw:border-2', +); + +const BUTTON_CLASS_NAME = 'tw:relative! tw:box-border! tw:bg-inherit! tw:cursor-pointer! tw:w-[28px]! tw:h-full! tw:p-1! tw:hover:opacity-80!'; + +export interface IFiltersActionButtonProps extends IconButtonProps { + active?: boolean; +} + +export const FiltersActionButton = observer(function FiltersActionButton({ active, className, size = 'small', ...rest }) { + return ( +
+ +
+ ); +}); diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilterButton.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilterButton.tsx new file mode 100644 index 0000000000..c47fd02c09 --- /dev/null +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilterButton.tsx @@ -0,0 +1,32 @@ +/* + * 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 { observer } from 'mobx-react-lite'; +import { useContext } from 'react'; + +import { IconOrImage, useTranslate } from '@cloudbeaver/core-blocks'; + +import type { IUsersActionButtonProps } from '../../UsersAdministrationService.js'; +import { FiltersActionButton } from './FiltersActionButton.js'; +import { UsersTableFiltersOpenContext } from './UsersTableFiltersOpenContext.js'; + +export const UsersTableFilterButton = observer(function UsersTableFilterButton() { + const translate = useTranslate(); + const openContext = useContext(UsersTableFiltersOpenContext); + + if (!openContext) { + throw new Error('UsersTableFilterButton must be rendered within UsersTableFiltersOpenContext'); + } + + const label = translate('authentication_administration_users_filters_filter_label'); + + return ( + + + + ); +}); diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.module.css b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.module.css index 220e53fea6..45b82c0f3a 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.module.css +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFilters.module.css @@ -1,11 +1,3 @@ -/* - * 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. - */ - .filterContainer { display: flex; gap: 12px; @@ -16,31 +8,7 @@ } .actions { - composes: theme-form-element-radius theme-background-surface theme-text-on-surface theme theme-border-color-background from global; - box-sizing: border-box; - border: 2px solid; - height: 32px; -} - -.button { - position: relative; - box-sizing: border-box; - background: inherit; - cursor: pointer; - width: 28px; - height: 100%; - padding: 4px; - - &:hover { - opacity: 0.8; - } -} - -.buttonActive { - background: var(--theme-secondary); -} - -.iconOrImage { - width: 100%; - height: 100%; + display: flex; + align-items: center; + gap: 8px; } 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 e60c33e2f6..3aeca27f1e 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 @@ -6,14 +6,16 @@ * you may not use this file except in compliance with the License. */ import { observer } from 'mobx-react-lite'; -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; -import { Filter, Group, IconOrImage, Loader, s, useS, useTranslate } from '@cloudbeaver/core-blocks'; +import { Filter, Group, Loader, Placeholder, s, useS, useTranslate } from '@cloudbeaver/core-blocks'; +import { useService } from '@cloudbeaver/core-di'; +import { UsersAdministrationService } from '../../UsersAdministrationService.js'; import styles from './UsersTableFilters.module.css'; import { UsersTableFiltersDetails } from './UsersTableFiltersDetails.js'; +import { UsersTableFiltersOpenContext } from './UsersTableFiltersOpenContext.js'; import { type IUserFilters } from './useUsersTableFilters.js'; -import { IconButton } from '@dbeaver/ui-kit'; interface Props { filters: IUserFilters; @@ -22,8 +24,11 @@ interface Props { export const UsersTableFilters = observer(function UsersTableFilters({ filters }) { const translate = useTranslate(); const style = useS(styles); + const usersAdministrationService = useService(UsersAdministrationService); const [open, setOpen] = useState(false); + const onToggle = useCallback(() => setOpen(open => !open), []); + const openContext = useMemo(() => ({ open, onToggle }), [open, onToggle]); return ( @@ -35,14 +40,9 @@ export const UsersTableFilters = observer(function UsersTableFilters({ fi onChange={filters.setSearch} />
- setOpen(!open)} - > - - + + +
diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFiltersOpenContext.ts b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFiltersOpenContext.ts new file mode 100644 index 0000000000..3745d6cf1f --- /dev/null +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/Filters/UsersTableFiltersOpenContext.ts @@ -0,0 +1,15 @@ +/* + * 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 { createContext } from 'react'; + +export interface IUsersTableFiltersOpenContext { + open: boolean; + onToggle: () => void; +} + +export const UsersTableFiltersOpenContext = createContext(null); diff --git a/webapp/packages/plugin-authentication-administration/src/index.ts b/webapp/packages/plugin-authentication-administration/src/index.ts index 4441479b12..3b8803e235 100644 --- a/webapp/packages/plugin-authentication-administration/src/index.ts +++ b/webapp/packages/plugin-authentication-administration/src/index.ts @@ -22,3 +22,5 @@ export * from './AdministrationUsersManagementService.js'; export * from './externalUserProviderStatusContext.js'; export * from './Administration/Users/Teams/TeamsForm/Options/getTeamOptionsFormPart.js'; export * from './Administration/Users/UsersTable/UsersTableOptionsPanelService.js'; +export * from './Administration/Users/UsersTable/Filters/useUsersTableFilters.js'; +export * from './Administration/Users/UsersTable/Filters/FiltersActionButton.js'; From 7a93d56459bf97083e17e23aeec4cb973a133788 Mon Sep 17 00:00:00 2001 From: Ruslan Musaev <43766501+HocKu7@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:17:44 +0200 Subject: [PATCH 3/9] dbeaver/pro#6455 add cancel button (#4533) * dbeaver/pro#6455 add cancel button * dbeaver/pro#6455 add cancel button * dbeaver/pro#6455 add cancel button * dbeaver/pro#6455 fix cancel before job start * dbeaver/pro#6455 chat message now in common model * dbeaver/pro#6455 add synchronization for cancel * dbeaver/pro#6455 add message cancel --------- Co-authored-by: naumov Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com> --- .../schema/service.ai.graphqls | 3 + .../io/cloudbeaver/service/ai/WebAIUtils.java | 65 ++++++++++++------- .../service/ai/gql/DBWServiceAI.java | 6 ++ .../service/ai/gql/WebServiceAI.java | 30 +++++++++ .../service/ai/gql/WebServiceBindingAI.java | 6 ++ .../ai/model/WebAiChatResponseConsumer.java | 40 ++++++++---- .../src/queries/ai/cancelConversation.gql | 3 + .../AIChatConversationsResource.ts | 5 ++ .../AIChatMessage/AIChatMessageForm.tsx | 31 ++++++++- .../packages/plugin-ai-chat/src/locales/en.ts | 2 + .../packages/plugin-ai-chat/src/locales/it.ts | 2 + .../packages/plugin-ai-chat/src/locales/ru.ts | 2 + .../packages/plugin-ai-chat/src/locales/zh.ts | 2 + 13 files changed, 158 insertions(+), 39 deletions(-) create mode 100644 webapp/packages/core-sdk/src/queries/ai/cancelConversation.gql diff --git a/server/bundles/io.cloudbeaver.service.ai/schema/service.ai.graphqls b/server/bundles/io.cloudbeaver.service.ai/schema/service.ai.graphqls index dd1a252204..b1095a333d 100644 --- a/server/bundles/io.cloudbeaver.service.ai/schema/service.ai.graphqls +++ b/server/bundles/io.cloudbeaver.service.ai/schema/service.ai.graphqls @@ -274,6 +274,9 @@ extend type Mutation @since(version: "23.2.2") { "Clears the chat messages in the AI chat conversation. The messages will be removed from the conversation." aiClearLastChatMessages(conversationId: ID!, messageId: ID!): Boolean! @since(version: "25.1.1") + "Cancels the in-progress AI response generation in the specified conversation." + aiCancelChatMessage(conversationId: ID!): Boolean! @since(version: "26.1.5") + "Saves AI settings (e.g. supporting confirming metadata transfer) for the specified connection." aiSaveDataSourceSettings(dataSourceId: DataSourceIdInput!, settings: AIDataSourceSettingsInput!): AIDataSourceSettingsInfo! @since(version: "25.3.3") } diff --git a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/WebAIUtils.java b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/WebAIUtils.java index 4a22f6c490..cff82e7217 100644 --- a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/WebAIUtils.java +++ b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/WebAIUtils.java @@ -24,6 +24,8 @@ import io.cloudbeaver.service.ai.model.WebAISendChatMessageInfo; import io.cloudbeaver.service.ai.model.WebAiChatResponseConsumer; import io.cloudbeaver.service.ai.model.events.WSAiChatMessageEvent; import io.cloudbeaver.utils.ServletAppUtils; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; @@ -39,9 +41,9 @@ import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.navigator.DBNUtils; +import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObject; -import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import java.time.Clock; @@ -139,10 +141,11 @@ public class WebAIUtils { @Nullable AIConfirmation confirmation, @NotNull String jobName ) { - webSession.setAttribute(getWaitingAttr(conversation), true); CompletableFuture result = new CompletableFuture<>(); - RuntimeUtils.scheduleJob( - jobName, monitor -> { + AbstractJob job = new AbstractJob(jobName) { + @NotNull + @Override + protected IStatus run(@NotNull DBRProgressMonitor monitor) { try { AIChatResponseConsumer subscriber = new WebAiChatResponseConsumer(conversation, webSession, aiChatSession); aiChatSession.processAICompletion( @@ -159,15 +162,25 @@ public class WebAIUtils { } }); } catch (DBException e) { - log.error("Error processing AI completion", e); - var errorMessage = conversation.addMessage(AIMessage.errorMessage(e)); - webSession.addSessionEvent(new WSAiChatMessageEvent(new WebAIMessage(errorMessage, conversation))); - aiChatSession.notifyMessageAdd(conversation, errorMessage); + if (monitor.isCanceled()) { + log.debug("AI completion cancelled", e); + } else { + log.error("Error processing AI completion", e); + var errorMessage = conversation.addMessage(AIMessage.errorMessage(e)); + webSession.addSessionEvent(new WSAiChatMessageEvent(new WebAIMessage(errorMessage, conversation))); + aiChatSession.notifyMessageAdd(conversation, errorMessage); + } } finally { - webSession.removeAttribute(getWaitingAttr(conversation)); + // Only clear the flag if it still points to this job + if (webSession.getAttribute(getWaitingAttr(conversation)) == this) { + webSession.removeAttribute(getWaitingAttr(conversation)); + } } + return Status.OK_STATUS; } - ); + }; + webSession.setAttribute(getWaitingAttr(conversation), job); + job.schedule(); return result; } @@ -257,21 +270,25 @@ public class WebAIUtils { throw new DBWebException("AI services restricted for '%s'. Please contact your administrator if you need it.".formatted( conversation.getDataSource())); } - String caption = conversation.getCaption(); - AIChatMessage promptMessage = conversation.addMessage(message); - webSession.addSessionEvent(new WSAiChatMessageEvent(new WebAIMessage(promptMessage, conversation))); - aiChatSession.notifyMessageAdd(conversation, promptMessage); - if (!CommonUtils.equalObjects(caption, conversation.getCaption())) { - aiChatSession.notifyConversationRenamed(conversation, conversation.getCaption()); + AIChatMessage promptMessage; + AIChatMessage result; + synchronized (conversation) { + String caption = conversation.getCaption(); + promptMessage = conversation.addMessage(message); + webSession.addSessionEvent(new WSAiChatMessageEvent(new WebAIMessage(promptMessage, conversation))); + aiChatSession.notifyMessageAdd(conversation, promptMessage); + if (!CommonUtils.equalObjects(caption, conversation.getCaption())) { + aiChatSession.notifyConversationRenamed(conversation, conversation.getCaption()); + } + if (!AIUtils.hasValidConfiguration()) { + throw new DBWebException("Invalid AI configuration"); + } + if (webSession.getAttribute(WebAIUtils.getWaitingAttr(conversation)) != null) { + throw new DBWebException("Conversation is already waiting for response"); + } + result = new AIChatMessage(conversation.getNextMessageId(), AIMessage.assistantMessage("", null)); + WebAIUtils.scheduleConversationSubmission(webSession, aiChatSession, conversation, null, "AI completion"); } - if (!AIUtils.hasValidConfiguration()) { - throw new DBWebException("Invalid AI configuration"); - } - if (webSession.getAttribute(WebAIUtils.getWaitingAttr(conversation)) != null) { - throw new DBWebException("Conversation is already waiting for response"); - } - AIChatMessage result = new AIChatMessage(conversation.getNextMessageId(), AIMessage.assistantMessage("", null)); - WebAIUtils.scheduleConversationSubmission(webSession, aiChatSession, conversation, null, "AI completion"); return new WebAISendChatMessageInfo( new WebAIChatConversation(webSession, conversation), new WebAIMessage(promptMessage, conversation), diff --git a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/DBWServiceAI.java b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/DBWServiceAI.java index e55c64097e..3b729a21e2 100644 --- a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/DBWServiceAI.java +++ b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/DBWServiceAI.java @@ -139,6 +139,12 @@ public interface DBWServiceAI extends DBWService { @NotNull String messageId ) throws DBWebException; + @WebAction + boolean cancelChatMessage( + @NotNull WebSession webSession, + @NotNull String conversationId + ) throws DBWebException; + @NotNull @WebAction WebAIDataSourceSettings getDataSourceAiSettings( diff --git a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceAI.java b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceAI.java index c76bfbb00a..9f51f26461 100644 --- a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceAI.java +++ b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceAI.java @@ -25,6 +25,7 @@ import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.service.ai.WebAIUtils; import io.cloudbeaver.service.ai.model.*; +import io.cloudbeaver.service.ai.model.events.WSAiChatMessageEvent; import io.cloudbeaver.service.ai.model.inputs.DataSourceId; import io.cloudbeaver.service.ai.model.inputs.WebAIChatConversationInput; import io.cloudbeaver.service.ai.model.inputs.WebAIConfigurationProfileInput; @@ -46,12 +47,14 @@ import org.jkiss.dbeaver.model.ai.engine.AIDatabaseContext; import org.jkiss.dbeaver.model.ai.engine.AIEngine; import org.jkiss.dbeaver.model.ai.engine.AIEngineProperties; import org.jkiss.dbeaver.model.ai.engine.AIModel; +import org.jkiss.dbeaver.model.ai.internal.AIChatMessages; import org.jkiss.dbeaver.model.ai.prompt.AIPromptGenerateSql; import org.jkiss.dbeaver.model.ai.registry.*; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.data.json.JSONUtils; import org.jkiss.dbeaver.model.logical.DBSLogicalDataSource; import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor; +import org.jkiss.dbeaver.model.runtime.AbstractJob; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.websocket.event.WSWorkspaceConfigurationChangedEvent; import org.jkiss.dbeaver.runtime.DBWorkbench; @@ -397,6 +400,33 @@ public class WebServiceAI implements DBWServiceAI { return true; } + @Override + public boolean cancelChatMessage( + @NotNull WebSession webSession, + @NotNull String conversationId + ) throws DBWebException { + WebAIUtils.validateAiPluginEnabled(); + AIChatConversation conversation = WebAIUtils.getAiChatConversation(webSession, conversationId); + synchronized (conversation) { + boolean completionStarted = conversation.isActive(); + conversation.cancelConversation(); + boolean hadPendingJob = false; + if (webSession.getAttribute(WebAIUtils.getWaitingAttr(conversation)) instanceof AbstractJob job) { + hadPendingJob = true; + job.cancel(); + } + webSession.removeAttribute(WebAIUtils.getWaitingAttr(conversation)); + if (hadPendingJob && !completionStarted) { + // The completion job was still queued, so its response consumer will not be called. + // We need to add a cancellation message to the conversation and notify the client. + AIChatMessage cancelMessage = conversation.addMessage( + AIMessage.warningMessage(AIChatMessages.ai_chat_conversation_cancelled)); + webSession.addSessionEvent(new WSAiChatMessageEvent(new WebAIMessage(cancelMessage, conversation))); + } + } + return true; + } + @NotNull @Override public WebAIDataSourceSettings getDataSourceAiSettings( diff --git a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceBindingAI.java b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceBindingAI.java index 0615a4731a..69487e3bfa 100644 --- a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceBindingAI.java +++ b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/gql/WebServiceBindingAI.java @@ -163,6 +163,12 @@ public class WebServiceBindingAI extends WebServiceBindingBase imp getArgumentVal(env, "conversationId"), getArgumentVal(env, "messageId") ) + ).dataFetcher( + "aiCancelChatMessage", + env -> getService(env).cancelChatMessage( + getWebSession(env), + getArgumentVal(env, "conversationId") + ) ).dataFetcher( "aiCreateProfile", env -> getService(env).createProfile( getWebSession(env), diff --git a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/model/WebAiChatResponseConsumer.java b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/model/WebAiChatResponseConsumer.java index 77296210d4..bb61a90fd8 100644 --- a/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/model/WebAiChatResponseConsumer.java +++ b/server/bundles/io.cloudbeaver.service.ai/src/io/cloudbeaver/service/ai/model/WebAiChatResponseConsumer.java @@ -1,18 +1,18 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2026 DBeaver Corp + * Copyright (C) 2010-2026 DBeaver Corp and others * - * All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * NOTICE: All information contained herein is, and remains - * the property of DBeaver Corp and its suppliers, if any. - * The intellectual and technical concepts contained - * herein are proprietary to DBeaver Corp and its suppliers - * and may be covered by U.S. and Foreign Patents, - * patents in process, and are protected by trade secret or copyright law. - * Dissemination of this information or reproduction of this material - * is strictly forbidden unless prior written permission is obtained - * from DBeaver Corp. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package io.cloudbeaver.service.ai.model; @@ -22,9 +22,11 @@ import io.cloudbeaver.service.ai.model.events.WSAiChatMessageErrorEvent; import io.cloudbeaver.service.ai.model.events.WSAiChatMessageEvent; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.model.ai.*; +import org.jkiss.dbeaver.model.ai.internal.AIChatMessages; import org.jkiss.utils.CommonUtils; import java.util.List; +import java.util.concurrent.CancellationException; public class WebAiChatResponseConsumer implements AIChatResponseConsumer { private final StringBuilder responseBuilder; @@ -78,7 +80,12 @@ public class WebAiChatResponseConsumer implements AIChatResponseConsumer { @Override public void error(@NotNull Throwable throwable) { - var errorMessage = conversation.addMessage(AIMessage.errorMessage(throwable)); + + AIMessage aiMessage = throwable instanceof CancellationException cancellationException + ? AIMessage.warningMessage(cancellationException.getMessage()) + : AIMessage.errorMessage(throwable); + + AIChatMessage errorMessage = conversation.addMessage(aiMessage); if (responseBuilder.isEmpty()) { webSession.addSessionEvent( new WSAiChatMessageEvent(new WebAIMessage(errorMessage, conversation))); @@ -94,12 +101,19 @@ public class WebAiChatResponseConsumer implements AIChatResponseConsumer { } @Override - public void complete(@NotNull List meta, boolean finishConversation) { + public void complete(@NotNull List meta, boolean finishConversation, boolean isCanceled) { if (responseBuilder.isEmpty()) { + if (isCanceled) { + warning(AIChatMessages.ai_chat_conversation_cancelled); + } return; } AIChatMessage responseMessage = conversation.addMessage(AIMessage.assistantMessage(responseBuilder.toString(), meta)); chatSession.notifyMessageAdd(conversation, responseMessage); webSession.addSessionEvent(new WSAiChatMessageChunkEvent(conversation.getId(), responseMessage.id(), null, true)); + + if (isCanceled) { + warning(AIChatMessages.ai_chat_conversation_cancelled); + } } } diff --git a/webapp/packages/core-sdk/src/queries/ai/cancelConversation.gql b/webapp/packages/core-sdk/src/queries/ai/cancelConversation.gql new file mode 100644 index 0000000000..91a36576d7 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/ai/cancelConversation.gql @@ -0,0 +1,3 @@ +mutation cancelConversation($conversationId: ID!) { + result: aiCancelChatMessage(conversationId: $conversationId) +} diff --git a/webapp/packages/plugin-ai-chat/src/AIChat/AIChatConversation/AIChatConversationsResource.ts b/webapp/packages/plugin-ai-chat/src/AIChat/AIChatConversation/AIChatConversationsResource.ts index d5926e7e09..2d89ce9f45 100644 --- a/webapp/packages/plugin-ai-chat/src/AIChat/AIChatConversation/AIChatConversationsResource.ts +++ b/webapp/packages/plugin-ai-chat/src/AIChat/AIChatConversation/AIChatConversationsResource.ts @@ -92,6 +92,11 @@ export class AIChatConversationsResource extends CachedMapResource { + const { result } = await this.graphQLService.sdk.cancelConversation({ conversationId }); + return result; + } + protected async loader(originalKey: ResourceKey): Promise> { const conversationList: AIChatConversationInfo[] = []; diff --git a/webapp/packages/plugin-ai-chat/src/AIChat/AIChatMessage/AIChatMessageForm.tsx b/webapp/packages/plugin-ai-chat/src/AIChat/AIChatMessage/AIChatMessageForm.tsx index b8e89c71ef..42a2ce5732 100644 --- a/webapp/packages/plugin-ai-chat/src/AIChat/AIChatMessage/AIChatMessageForm.tsx +++ b/webapp/packages/plugin-ai-chat/src/AIChat/AIChatMessage/AIChatMessageForm.tsx @@ -13,10 +13,12 @@ import { ActionIconButton, AutoResizeTextarea, Form, s, useS, useTranslate } fro import { useService } from '@cloudbeaver/core-di'; import { getOS, OperatingSystem } from '@cloudbeaver/core-utils'; import { NotificationService } from '@cloudbeaver/core-events'; +import { Command } from '@dbeaver/ui-kit'; import { AIChatMessageService } from './AIChatMessageService.js'; import { AIChatConversationsService } from '../AIChatConversation/AIChatConversationsService.js'; import { AIChatContext } from '../AIChatContext.js'; +import { AIChatConversationsResource } from '../AIChatConversation/AIChatConversationsResource.js'; import classes from './AIChatMessageForm.module.css'; interface Props { @@ -30,6 +32,7 @@ export const AIChatMessageForm = observer>(function AIC const notificationService = useService(NotificationService); const aiChatMessageService = useService(AIChatMessageService); const aiChatConversationsService = useService(AIChatConversationsService); + const aiChatConversationsResource = useService(AIChatConversationsResource); const [value, setValue] = useState(''); @@ -54,6 +57,16 @@ export const AIChatMessageForm = observer>(function AIC } } + async function cancel() { + if (currentConversationId) { + try { + await aiChatConversationsResource.cancelConversation(currentConversationId); + } catch (exception: any) { + notificationService.logException(exception, 'plugin_ai_chat_conversation_cancel_failed'); + } + } + } + function getPlaceholder() { const OS = getOS(); const symbol = OS === OperatingSystem.macOS ? '⌘' : 'Ctrl'; @@ -65,7 +78,12 @@ export const AIChatMessageForm = observer>(function AIC return (
-
+
>(function AIC autoFocus onChange={v => setValue(v)} /> - + {!aiChatConversationsService.processing ? ( + + ) : ( + +
+ + )}
{children} diff --git a/webapp/packages/plugin-ai-chat/src/locales/en.ts b/webapp/packages/plugin-ai-chat/src/locales/en.ts index 5b148391a2..4dc15459e3 100644 --- a/webapp/packages/plugin-ai-chat/src/locales/en.ts +++ b/webapp/packages/plugin-ai-chat/src/locales/en.ts @@ -44,6 +44,8 @@ export default [ ['plugin_ai_chat_conversation_history_date_group_last_7_days', 'Last 7 days'], ['plugin_ai_chat_conversation_history_date_group_over_week_ago', 'Over a week ago'], + ['plugin_ai_chat_conversation_cancel_failed', 'Failed to cancel the conversation'], + ['plugin_ai_chat_scope_change', 'Configure AI context'], ['plugin_ai_chat_scope_change_fail', 'Failed to change context'], ['plugin_ai_chat_profile_group', 'Active configuration'], diff --git a/webapp/packages/plugin-ai-chat/src/locales/it.ts b/webapp/packages/plugin-ai-chat/src/locales/it.ts index 609e6e8907..546bca837b 100644 --- a/webapp/packages/plugin-ai-chat/src/locales/it.ts +++ b/webapp/packages/plugin-ai-chat/src/locales/it.ts @@ -44,6 +44,8 @@ export default [ ['plugin_ai_chat_conversation_history_date_group_last_7_days', 'Last 7 days'], ['plugin_ai_chat_conversation_history_date_group_over_week_ago', 'Over a week ago'], + ['plugin_ai_chat_conversation_cancel_failed', 'Impossibile annullare la conversazione'], + ['plugin_ai_chat_scope_change', 'Configure AI context'], ['plugin_ai_chat_scope_change_fail', 'Failed to change context'], ['plugin_ai_chat_profile_group', 'Active configuration'], diff --git a/webapp/packages/plugin-ai-chat/src/locales/ru.ts b/webapp/packages/plugin-ai-chat/src/locales/ru.ts index 4cbbbc3f43..e3cbb52884 100644 --- a/webapp/packages/plugin-ai-chat/src/locales/ru.ts +++ b/webapp/packages/plugin-ai-chat/src/locales/ru.ts @@ -44,6 +44,8 @@ export default [ ['plugin_ai_chat_conversation_history_date_group_last_7_days', 'Последние 7 дней'], ['plugin_ai_chat_conversation_history_date_group_over_week_ago', 'Более недели назад'], + ['plugin_ai_chat_conversation_cancel_failed', 'Не удалось отменить разговор'], + ['plugin_ai_chat_scope_change', 'Настроить AI контекст'], ['plugin_ai_chat_scope_change_fail', 'Не удалось изменить контекст'], ['plugin_ai_chat_profile_group', 'Активная конфигурация'], diff --git a/webapp/packages/plugin-ai-chat/src/locales/zh.ts b/webapp/packages/plugin-ai-chat/src/locales/zh.ts index a7d0b2c7cc..6fa2ea9c49 100644 --- a/webapp/packages/plugin-ai-chat/src/locales/zh.ts +++ b/webapp/packages/plugin-ai-chat/src/locales/zh.ts @@ -44,6 +44,8 @@ export default [ ['plugin_ai_chat_conversation_history_date_group_last_7_days', 'Last 7 days'], ['plugin_ai_chat_conversation_history_date_group_over_week_ago', 'Over a week ago'], + ['plugin_ai_chat_conversation_cancel_failed', '无法取消对话'], + ['plugin_ai_chat_scope_change', 'Configure AI context'], ['plugin_ai_chat_scope_change_fail', 'Failed to change context'], ['plugin_ai_chat_profile_group', 'Active configuration'], From 5fb7234e24ba6fe1ae36bd9762e75d7fa9a0d213 Mon Sep 17 00:00:00 2001 From: alex <48489896+devnaumov@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:22:11 +0200 Subject: [PATCH 4/9] dbeaver/pro#9901 reset password after submit (#4542) Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com> --- .../UserForm/Info/UserFormInfoCredentials.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UserForm/Info/UserFormInfoCredentials.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UserForm/Info/UserFormInfoCredentials.tsx index a8bfb12a41..8840a687fb 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UserForm/Info/UserFormInfoCredentials.tsx +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UserForm/Info/UserFormInfoCredentials.tsx @@ -5,13 +5,16 @@ * 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-lite'; +import { useState } from 'react'; import { AUTH_PROVIDER_LOCAL_ID, AuthProvidersResource, isLocalUser, UsersResource } from '@cloudbeaver/core-authentication'; import { Container, GroupTitle, InputField, + useExecutor, useFormCustomInputValidation, usePasswordValidation, useResource, @@ -39,6 +42,8 @@ export const UserFormInfoCredentials = observer(function UserFormInfoCred const authProvidersResource = useResource(UserFormInfoCredentials, AuthProvidersResource, null); const passwordValidationRef = usePasswordValidation(); + const [repeatedPassword, setRepeatedPassword] = useState(''); + let local = authProvidersResource.resource.isEnabled(AUTH_PROVIDER_LOCAL_ID); if (!local) { @@ -66,6 +71,15 @@ export const UserFormInfoCredentials = observer(function UserFormInfoCred return null; }); + useExecutor({ + executor: formState.submitTask, + handlers: [ + function handleSubmit(data) { + setRepeatedPassword(''); + }, + ], + }); + return ( {translate('authentication_user_credentials')} @@ -102,13 +116,14 @@ export const UserFormInfoCredentials = observer(function UserFormInfoCred setRepeatedPassword(v)} > {translate('authentication_user_password_repeat')} From 317750ea7d36f4a9aaa09642b078e24e3bbabf95 Mon Sep 17 00:00:00 2001 From: Viktor Kirst Date: Tue, 11 Aug 2026 20:16:38 +0400 Subject: [PATCH 5/9] dbeaver/pro#9733 Rename X- headers to CB- with backward compatibility (#4517) --- .../src/io/cloudbeaver/utils/ServletAppUtils.java | 8 ++++++++ .../server/websockets/CBEventsLongPollingServlet.java | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java index 808e6df570..cfc0d8d929 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/ServletAppUtils.java @@ -235,6 +235,14 @@ public class ServletAppUtils { response.addCookie(sessionCookie); } + public static String getHeaderOrLegacy(HttpServletRequest request, String headerName, String legacyHeaderName) { + String value = request.getHeader(headerName); + if (CommonUtils.isEmpty(value)) { + value = request.getHeader(legacyHeaderName); + } + return value; + } + public static String getRequestCookie(HttpServletRequest request, String cookieName) { Cookie[] cookies = request.getCookies(); if (cookies != null) { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java index 46432e8550..d81b15f03a 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPollingServlet.java @@ -215,6 +215,7 @@ public class CBEventsLongPollingServlet extends HttpServlet { ps.handleWebSessionEvent(new WSSocketConnectedEvent(ws.getApplication().getApplicationRunId())); resp.setHeader(WSConstants.WS_SESSION_HEADER, sid); + resp.setHeader(WSConstants.WS_SESSION_HEADER_LEGACY, sid); log.debug("HTTP Long-Poll channel opened for session " + sid); return ps; @@ -304,7 +305,7 @@ public class CBEventsLongPollingServlet extends HttpServlet { @Override public BaseWebSession resolve(@NotNull HttpServletRequest req) throws SMException { - String sid = req.getHeader(WSConstants.WS_SESSION_HEADER); + String sid = ServletAppUtils.getHeaderOrLegacy(req, WSConstants.WS_SESSION_HEADER, WSConstants.WS_SESSION_HEADER_LEGACY); String token = req.getHeader(WSConstants.WS_AUTH_HEADER); if (CommonUtils.isEmpty(sid) && CommonUtils.isEmpty(token)) { From 5be49b8a7ec5dbe20bb7019b72b6cdf20b4e7f12 Mon Sep 17 00:00:00 2001 From: Sychev Andrey <44414066+SychevAndrey@users.noreply.github.com> Date: Tue, 11 Aug 2026 18:45:36 +0200 Subject: [PATCH 6/9] dbeaver/pro#8821 feat: add import settings step (#4506) * dbeaver/pro#8821 feat: add gql query for import * dbeaver/cloudbeaver#8821 throw readable exception on import fail * dbeaver/pro#8821 feat: add import settings step * dbeaver/pro#8821 refactor: gql types for driver config * dbeaver/pro#8821 refactor: use connectionKey * dbeaver/pro#8821 add open New Connection * dbeaver/pro#8821 feat: add openNewConnection checkbox and replace docs link * dbeaver/pro#8821 feat: clear onDuplicateKey if useBulk is active * dbeaver/pro#8821 feat: add titles * dbeaver/pro#8821 refactor: remove extra checks (not a driver config, always true) * dbeaver/pro#8821 remove defaultOpenNewConnection from driverConfiguration * dbeaver/pro#8821 feat: let a user to clear the replace method * dbeaver/pro#8821 refactor: update open new connection tooltip * dbeaver/pro#8821 feat: remove checks for settings step Always show settings steps with at least one option: use new connection * dbeaver/pro#8821 refactor: simplify dialog's footer --------- Co-authored-by: Ruslan Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com> Co-authored-by: Ainur <59531286+yagudin10@users.noreply.github.com> --- .../schema/service.data.transfer.graphqls | 2 + .../transfer/impl/WebServiceDataTransfer.java | 5 +- ...getConnectionImportDriverConfiguration.gql | 9 +++ .../queries/fragments/DriverConfiguration.gql | 9 +++ .../packages/plugin-data-import/package.json | 1 + .../src/DataImportBootstrap.ts | 11 ++- .../src/DataImportDialog/DataImportDialog.tsx | 40 ++++++++-- .../DataImportDialog/EDataImportDialogStep.ts | 3 +- .../IDataImportDialogState.ts | 5 +- .../DataImportDialog/ImportSettingsForm.tsx | 72 +++++++++++++++++ .../DataImportDialog/useDataImportDialog.ts | 52 ++++++++++-- .../DataImportDriverConfigurationResource.ts | 79 +++++++++++++++++++ .../src/DataImportService.ts | 18 +++-- .../plugin-data-import/src/locales/en.ts | 20 +++++ .../plugin-data-import/src/locales/fr.ts | 19 +++++ .../plugin-data-import/src/locales/it.ts | 20 +++++ .../plugin-data-import/src/locales/ru.ts | 20 +++++ .../plugin-data-import/src/locales/vi.ts | 19 +++++ .../plugin-data-import/src/locales/zh.ts | 13 +++ .../packages/plugin-data-import/src/module.ts | 2 + .../packages/plugin-data-import/tsconfig.json | 3 + webapp/yarn.lock | 1 + 22 files changed, 397 insertions(+), 26 deletions(-) create mode 100644 webapp/packages/core-sdk/src/queries/connections/getConnectionImportDriverConfiguration.gql create mode 100644 webapp/packages/core-sdk/src/queries/fragments/DriverConfiguration.gql create mode 100644 webapp/packages/plugin-data-import/src/DataImportDialog/ImportSettingsForm.tsx create mode 100644 webapp/packages/plugin-data-import/src/DataImportDriverConfigurationResource.ts diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls b/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls index 3fd450d429..9b2231c8e0 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls +++ b/server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls @@ -48,6 +48,8 @@ input DataTransferImportSettings { useBulkLoad: Boolean "Use transactions during import" useTransactions: Boolean + "Open new connection(s) for the import task" + openNewConnection: Boolean } input DataTransferImportParameters { diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java index 86a93c4896..32b2672ac3 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java @@ -425,7 +425,7 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { throw new DBWebException("Import is canceled"); } } catch (DBException e) { - throw new DBWebException("Import failed cause: " + e.getMessage()); + throw new DBWebException("Import failed", e); } } } @@ -446,6 +446,9 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { consumerSettings.setUseTransactions(CommonUtils.getBoolean( settings.get(DTConstants.PROP_USE_TRANSACTIONS), consumerSettings.isUseTransactions())); + consumerSettings.setOpenNewConnections(CommonUtils.getBoolean( + settings.get(DTConstants.PROP_OPEN_NEW_CONNECTION), + consumerSettings.isOpenNewConnections())); } } diff --git a/webapp/packages/core-sdk/src/queries/connections/getConnectionImportDriverConfiguration.gql b/webapp/packages/core-sdk/src/queries/connections/getConnectionImportDriverConfiguration.gql new file mode 100644 index 0000000000..c2c51be19e --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/connections/getConnectionImportDriverConfiguration.gql @@ -0,0 +1,9 @@ +query getConnectionImportDriverConfiguration($projectId: ID, $connectionId: ID!) { + connections: userConnections(projectId: $projectId, id: $connectionId) { + id + projectId + driverConfiguration { + ...DriverConfiguration + } + } +} diff --git a/webapp/packages/core-sdk/src/queries/fragments/DriverConfiguration.gql b/webapp/packages/core-sdk/src/queries/fragments/DriverConfiguration.gql new file mode 100644 index 0000000000..7366bfc8cc --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/DriverConfiguration.gql @@ -0,0 +1,9 @@ +fragment DriverConfiguration on DriverConfiguration { + supportedInsertReplaceMethods { + id + name + description + } + supportsBulkLoad + supportsTransactions +} diff --git a/webapp/packages/plugin-data-import/package.json b/webapp/packages/plugin-data-import/package.json index 88119f2dfe..6c8d101869 100644 --- a/webapp/packages/plugin-data-import/package.json +++ b/webapp/packages/plugin-data-import/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@cloudbeaver/core-blocks": "workspace:*", + "@cloudbeaver/core-connections": "workspace:*", "@cloudbeaver/core-di": "workspace:*", "@cloudbeaver/core-dialogs": "workspace:*", "@cloudbeaver/core-events": "workspace:*", diff --git a/webapp/packages/plugin-data-import/src/DataImportBootstrap.ts b/webapp/packages/plugin-data-import/src/DataImportBootstrap.ts index e881c96352..44e40e8e93 100644 --- a/webapp/packages/plugin-data-import/src/DataImportBootstrap.ts +++ b/webapp/packages/plugin-data-import/src/DataImportBootstrap.ts @@ -5,6 +5,7 @@ * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ +import { createConnectionParam } from '@cloudbeaver/core-connections'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs'; import { ACTION_IMPORT, ActionService, menuExtractItems, MenuService } from '@cloudbeaver/core-view'; @@ -72,16 +73,20 @@ export class DataImportBootstrap extends Bootstrap { throw new Error('Execution context must be provided'); } - const { status, result: dialogResult } = await this.commonDialogService.open(DataImportDialogLazy, { tableName: model.name ?? model.id }); + const connectionKey = createConnectionParam(executionContext.projectId, executionContext.connectionId); + const { status, result: dialogResult } = await this.commonDialogService.open(DataImportDialogLazy, { + tableName: model.name ?? model.id, + connectionKey, + }); if (status === DialogueStateResult.Resolved && dialogResult) { const success = await this.dataImportService.importData( - executionContext.connectionId, + connectionKey, executionContext.id, - executionContext.projectId, result.id, dialogResult.processorId, dialogResult.file, + dialogResult.settings, ); if (success) { diff --git a/webapp/packages/plugin-data-import/src/DataImportDialog/DataImportDialog.tsx b/webapp/packages/plugin-data-import/src/DataImportDialog/DataImportDialog.tsx index ec9753f828..078d508b8b 100644 --- a/webapp/packages/plugin-data-import/src/DataImportDialog/DataImportDialog.tsx +++ b/webapp/packages/plugin-data-import/src/DataImportDialog/DataImportDialog.tsx @@ -1,28 +1,42 @@ /* * 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 { observer } from 'mobx-react-lite'; -import { Button, CommonDialogBody, CommonDialogFooter, CommonDialogHeader, CommonDialogWrapper, useTranslate } from '@cloudbeaver/core-blocks'; +import { + Button, + CommonDialogBody, + CommonDialogFooter, + CommonDialogHeader, + CommonDialogWrapper, + useResource, + useTranslate, +} from '@cloudbeaver/core-blocks'; +import type { IConnectionInfoParams } from '@cloudbeaver/core-connections'; import type { DialogComponent } from '@cloudbeaver/core-dialogs'; +import type { DataTransferImportSettings } from '@cloudbeaver/core-sdk'; +import { DataImportDriverConfigurationResource } from '../DataImportDriverConfigurationResource.js'; import { DataImportFileSelector } from './DataImportFileSelector.js'; import { EDataImportDialogStep } from './EDataImportDialogStep.js'; import type { IDataImportDialogState } from './IDataImportDialogState.js'; import { ImportProcessorList } from './ImportProcessorList.js'; +import { ImportSettingsForm } from './ImportSettingsForm.js'; import { useDataImportDialog } from './useDataImportDialog.js'; export interface IDataImportDialogResult { file: File; processorId: string; + settings: DataTransferImportSettings; } export interface IDataImportDialogPayload { tableName: string; + connectionKey: IConnectionInfoParams; initialState?: IDataImportDialogState; } @@ -33,38 +47,52 @@ export const DataImportDialog: DialogComponent {dialog.state.step === EDataImportDialogStep.Processor && } {dialog.state.step === EDataImportDialogStep.File && } + {dialog.state.step === EDataImportDialogStep.Settings && driverConfiguration && ( + + )} - {dialog.state.step === EDataImportDialogStep.File && ( + {dialog.state.step !== EDataImportDialogStep.Processor && (
)} diff --git a/webapp/packages/plugin-data-import/src/DataImportDialog/EDataImportDialogStep.ts b/webapp/packages/plugin-data-import/src/DataImportDialog/EDataImportDialogStep.ts index e4385692bd..7ac8b41052 100644 --- a/webapp/packages/plugin-data-import/src/DataImportDialog/EDataImportDialogStep.ts +++ b/webapp/packages/plugin-data-import/src/DataImportDialog/EDataImportDialogStep.ts @@ -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. @@ -8,4 +8,5 @@ export enum EDataImportDialogStep { Processor, File, + Settings, } diff --git a/webapp/packages/plugin-data-import/src/DataImportDialog/IDataImportDialogState.ts b/webapp/packages/plugin-data-import/src/DataImportDialog/IDataImportDialogState.ts index 2631efb81c..785becd6d5 100644 --- a/webapp/packages/plugin-data-import/src/DataImportDialog/IDataImportDialogState.ts +++ b/webapp/packages/plugin-data-import/src/DataImportDialog/IDataImportDialogState.ts @@ -1,11 +1,11 @@ /* * 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 type { DataTransferProcessorInfo } from '@cloudbeaver/core-sdk'; +import type { DataTransferImportSettings, DataTransferProcessorInfo } from '@cloudbeaver/core-sdk'; import type { EDataImportDialogStep } from './EDataImportDialogStep.js'; @@ -13,4 +13,5 @@ export interface IDataImportDialogState { step: EDataImportDialogStep; file: File | null; selectedProcessor: DataTransferProcessorInfo | null; + settings: DataTransferImportSettings; } diff --git a/webapp/packages/plugin-data-import/src/DataImportDialog/ImportSettingsForm.tsx b/webapp/packages/plugin-data-import/src/DataImportDialog/ImportSettingsForm.tsx new file mode 100644 index 0000000000..291da2deeb --- /dev/null +++ b/webapp/packages/plugin-data-import/src/DataImportDialog/ImportSettingsForm.tsx @@ -0,0 +1,72 @@ +/* + * 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 { observer } from 'mobx-react-lite'; +import { useEffect } from 'react'; + +import { Combobox, Container, FieldCheckbox, Link, useTranslate } from '@cloudbeaver/core-blocks'; +import type { DataTransferImportSettings } from '@cloudbeaver/core-sdk'; + +import type { IDataImportDriverConfiguration } from '../DataImportDriverConfigurationResource.js'; + +interface Props { + settings: DataTransferImportSettings; + driverConfiguration: IDataImportDriverConfiguration; +} + +export const ImportSettingsForm = observer(function ImportSettingsForm({ settings, driverConfiguration }) { + const translate = useTranslate(); + const { supportedInsertReplaceMethods, supportsBulkLoad, supportsTransactions } = driverConfiguration; + + useEffect(() => { + if (settings.useBulkLoad) { + settings.onDuplicateKeyMethod = undefined; + } + }, [settings.useBulkLoad]); + + return ( + + {supportedInsertReplaceMethods.length > 0 && ( +
+ method.id} + valueSelector={method => method.name} + titleSelector={method => method.description ?? undefined} + disabled={settings.useBulkLoad} + title={translate('plugin_data_import_settings_on_duplicate_key_title')} + placeholder={translate('plugin_data_import_settings_on_duplicate_key_placeholder')} + allowClear + > + {translate('plugin_data_import_settings_on_duplicate_key')} + + + {translate('plugin_data_import_settings_on_duplicate_key_help')} + +
+ )} + + + {supportsBulkLoad && ( + + {translate('plugin_data_import_settings_use_bulk_load')} + + )} + {supportsTransactions && ( + + {translate('plugin_data_import_settings_use_transactions')} + + )} + + {translate('plugin_data_import_settings_open_new_connection')} + + +
+ ); +}); diff --git a/webapp/packages/plugin-data-import/src/DataImportDialog/useDataImportDialog.ts b/webapp/packages/plugin-data-import/src/DataImportDialog/useDataImportDialog.ts index 6ad0c6a587..431f941113 100644 --- a/webapp/packages/plugin-data-import/src/DataImportDialog/useDataImportDialog.ts +++ b/webapp/packages/plugin-data-import/src/DataImportDialog/useDataImportDialog.ts @@ -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. @@ -8,14 +8,16 @@ import { action, observable } from 'mobx'; import { useObservableRef } from '@cloudbeaver/core-blocks'; -import type { DataTransferProcessorInfo } from '@cloudbeaver/core-sdk'; +import type { DataTransferImportSettings, DataTransferProcessorInfo } from '@cloudbeaver/core-sdk'; +import type { IDataImportDriverConfiguration } from '../DataImportDriverConfigurationResource.js'; import { EDataImportDialogStep } from './EDataImportDialogStep.js'; import type { IDataImportDialogState } from './IDataImportDialogState.js'; interface IDialog { state: IDataImportDialogState; stepBack: () => void; + goToSettings: (configuration: IDataImportDriverConfiguration | null) => void; selectProcessor: (processor: DataTransferProcessorInfo) => void; deleteFile: () => void; reset: () => void; @@ -25,17 +27,46 @@ const DEFAULT_STATE_GETTER: () => IDataImportDialogState = () => ({ step: EDataImportDialogStep.Processor, file: null, selectedProcessor: null, + settings: {}, }); -export function useDataImportDialog(initialState?: IDataImportDialogState) { - const dialog = useObservableRef( +function getDefaultSettings(configuration: IDataImportDriverConfiguration): DataTransferImportSettings { + const settings: DataTransferImportSettings = { + openNewConnection: true, + }; + + if (configuration.supportsTransactions) { + settings.useTransactions = true; + } + + if (configuration.supportedInsertReplaceMethods) { + settings.onDuplicateKeyMethod = undefined; + } + + if (configuration.supportsBulkLoad) { + settings.useBulkLoad = false; + } + + return settings; +} + +export function useDataImportDialog(initialState?: IDataImportDialogState): IDialog { + return useObservableRef( () => ({ state: initialState ?? DEFAULT_STATE_GETTER(), stepBack() { - if (this.state.step === EDataImportDialogStep.File) { + if (this.state.step === EDataImportDialogStep.Settings) { + this.state.step = EDataImportDialogStep.File; + } else if (this.state.step === EDataImportDialogStep.File) { this.state.step = EDataImportDialogStep.Processor; } }, + goToSettings(configuration: IDataImportDriverConfiguration | null) { + if (configuration) { + this.state.settings = { ...getDefaultSettings(configuration), ...this.state.settings }; + } + this.state.step = EDataImportDialogStep.Settings; + }, selectProcessor(processor: DataTransferProcessorInfo) { if (this.state.selectedProcessor && this.state.selectedProcessor.id !== processor.id) { this.reset(); @@ -51,9 +82,14 @@ export function useDataImportDialog(initialState?: IDataImportDialogState) { this.state = DEFAULT_STATE_GETTER(); }, }), - { state: observable, stepBack: action.bound, selectProcessor: action.bound, deleteFile: action.bound, reset: action.bound }, + { + state: observable, + stepBack: action.bound, + goToSettings: action.bound, + selectProcessor: action.bound, + deleteFile: action.bound, + reset: action.bound, + }, false, ); - - return dialog; } diff --git a/webapp/packages/plugin-data-import/src/DataImportDriverConfigurationResource.ts b/webapp/packages/plugin-data-import/src/DataImportDriverConfigurationResource.ts new file mode 100644 index 0000000000..2ea34100dd --- /dev/null +++ b/webapp/packages/plugin-data-import/src/DataImportDriverConfigurationResource.ts @@ -0,0 +1,79 @@ +/* + * 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 { toJS } from 'mobx'; + +import { + CONNECTION_INFO_PARAM_SCHEMA, + ConnectionInfoResource, + createConnectionParam, + type IConnectionInfoParams, + isConnectionInfoParamEqual, +} from '@cloudbeaver/core-connections'; +import { injectable } from '@cloudbeaver/core-di'; +import { CachedMapResource, isResourceAlias, type ResourceKey, resourceKeyList, ResourceKeyUtils } from '@cloudbeaver/core-resource'; +import { type DriverConfigurationFragment, type GetConnectionImportDriverConfigurationQuery, GraphQLService } from '@cloudbeaver/core-sdk'; +import { schemaValidationError } from '@cloudbeaver/core-utils'; + +export type IDataImportDriverConfiguration = DriverConfigurationFragment; + +@injectable(() => [GraphQLService, ConnectionInfoResource]) +export class DataImportDriverConfigurationResource extends CachedMapResource { + constructor( + private readonly graphQLService: GraphQLService, + private readonly connectionInfoResource: ConnectionInfoResource, + ) { + super(); + + this.sync(connectionInfoResource); + connectionInfoResource.onItemDelete.addHandler(this.delete.bind(this)); + } + + override isKeyEqual(param: IConnectionInfoParams, second: IConnectionInfoParams): boolean { + return isConnectionInfoParamEqual(param, second); + } + + protected async loader(originalKey: ResourceKey): Promise> { + if (isResourceAlias(originalKey)) { + throw new Error('Aliases are not supported by this resource'); + } + + const connectionsList: GetConnectionImportDriverConfigurationQuery['connections'] = []; + + await ResourceKeyUtils.forEachAsync(originalKey, async key => { + if (!this.connectionInfoResource.isConnected(key)) { + throw new Error(`Connection is not connected (${key.projectId}, ${key.connectionId})`); + } + + const { connections } = await this.graphQLService.sdk.getConnectionImportDriverConfiguration({ + projectId: key.projectId, + connectionId: key.connectionId, + }); + + if (!connections.some(connection => connection.id === key.connectionId)) { + throw new Error(`Connection is not found (${key.connectionId})`); + } + + connectionsList.push(...connections); + }); + + this.set( + resourceKeyList(connectionsList.map(createConnectionParam)), + connectionsList.map(connection => connection.driverConfiguration), + ); + + return this.data; + } + + protected validateKey(key: IConnectionInfoParams): boolean { + const parse = CONNECTION_INFO_PARAM_SCHEMA.safeParse(toJS(key)); + if (!parse.success) { + this.logger.warn(`Invalid resource key ${schemaValidationError(parse.error).toString()}`); + } + return parse.success; + } +} diff --git a/webapp/packages/plugin-data-import/src/DataImportService.ts b/webapp/packages/plugin-data-import/src/DataImportService.ts index f6bb8e412a..27d2593b4a 100644 --- a/webapp/packages/plugin-data-import/src/DataImportService.ts +++ b/webapp/packages/plugin-data-import/src/DataImportService.ts @@ -8,10 +8,11 @@ import { computed, makeObservable } from 'mobx'; import { ProcessSnackbar } from '@cloudbeaver/core-blocks'; +import type { IConnectionInfoParams } from '@cloudbeaver/core-connections'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; import { AsyncTaskInfoService, EAdminPermission, SessionPermissionsResource } from '@cloudbeaver/core-root'; -import { GraphQLService } from '@cloudbeaver/core-sdk'; +import { type DataTransferImportSettings, GraphQLService } from '@cloudbeaver/core-sdk'; import { getProgressPercent } from '@cloudbeaver/core-utils'; import { DataImportSettingsService } from './DataImportSettingsService.js'; @@ -38,7 +39,14 @@ export class DataImportService { }); } - async importData(connectionId: string, contextId: string, projectId: string, resultsId: string, processorId: string, file: File): Promise { + async importData( + connectionKey: IConnectionInfoParams, + contextId: string, + resultsId: string, + processorId: string, + file: File, + settings?: DataTransferImportSettings, + ): Promise { const abortController = new AbortController(); let cancelImplementation: (() => void | Promise) | null; let isCancelled = false; @@ -65,11 +73,11 @@ export class DataImportService { const { taskInfo } = await this.graphQLService.sdk.dataTransferImportDataIntoResults( { - connectionId, contextId, - projectId, + connectionId: connectionKey.connectionId, + projectId: connectionKey.projectId, resultsId, - parameters: { processorId }, + parameters: { processorId, settings }, }, undefined, abortController.signal, diff --git a/webapp/packages/plugin-data-import/src/locales/en.ts b/webapp/packages/plugin-data-import/src/locales/en.ts index 3c505d522f..d6bff02c17 100644 --- a/webapp/packages/plugin-data-import/src/locales/en.ts +++ b/webapp/packages/plugin-data-import/src/locales/en.ts @@ -4,4 +4,24 @@ export default [ ['plugin_data_import_process_success', 'Data imported successfully'], ['plugin_data_import_process_fail', 'Data import failed'], ['plugin_data_import_process_file_processing_step_message', 'File uploaded, processing...'], + ['plugin_data_import_settings_on_duplicate_key', 'On duplicate key'], + ['plugin_data_import_settings_use_bulk_load', 'Use bulk load'], + ['plugin_data_import_settings_use_bulk_load_title', 'Use bulk load for faster import'], + ['plugin_data_import_settings_use_transactions', 'Use transactions'], + [ + 'plugin_data_import_settings_use_transactions_title', + 'Execute the import within a database transaction. If the import fails, all changes can be rolled back', + ], + + [ + 'plugin_data_import_settings_on_duplicate_key_title', + 'Choose how to handle rows that already exist in the target table based on a primary or unique key', + ], + ['plugin_data_import_settings_on_duplicate_key_placeholder', 'None'], + ['plugin_data_import_settings_open_new_connection', 'Open new connection'], + [ + 'plugin_data_import_settings_open_new_connection_title', + 'Use this option to speed up data transfer. If selected, a new connection will be opened and the data transfer will not interfere with other calls to the database where data is being transferred to.', + ], + ['plugin_data_import_settings_on_duplicate_key_help', 'Learn more about the "On duplicate key" setting'], ]; diff --git a/webapp/packages/plugin-data-import/src/locales/fr.ts b/webapp/packages/plugin-data-import/src/locales/fr.ts index ea7dd3ef6c..4209c96762 100644 --- a/webapp/packages/plugin-data-import/src/locales/fr.ts +++ b/webapp/packages/plugin-data-import/src/locales/fr.ts @@ -4,4 +4,23 @@ export default [ ['plugin_data_import_process_success', 'Données importées avec succès'], ['plugin_data_import_process_fail', "Échec de l'importation des données"], ['plugin_data_import_process_file_processing_step_message', 'Fichier téléchargé, en cours de traitement...'], + ['plugin_data_import_settings_on_duplicate_key', 'En cas de clé dupliquée'], + [ + 'plugin_data_import_settings_on_duplicate_key_title', + "Choisissez comment gérer les lignes qui existent déjà dans la table cible en fonction d'une clé primaire ou unique", + ], + ['plugin_data_import_settings_use_bulk_load_title', 'Utiliser le chargement en masse pour un import plus rapide'], + ['plugin_data_import_settings_use_bulk_load', 'Utiliser le chargement en masse'], + ['plugin_data_import_settings_use_transactions', 'Utiliser les transactions'], + [ + 'plugin_data_import_settings_use_transactions_title', + "Exécuter l'importation dans une transaction de base de données. Si l'importation échoue, toutes les modifications peuvent être annulées", + ], + ['plugin_data_import_settings_on_duplicate_key_placeholder', 'Aucune'], + ['plugin_data_import_settings_open_new_connection', 'Ouvrir une nouvelle connexion'], + [ + 'plugin_data_import_settings_open_new_connection_title', + "Utilisez cette option pour accélérer le transfert de données. Si elle est sélectionnée, une nouvelle connexion sera ouverte et le transfert de données n'interférera pas avec les autres appels à la base de données vers laquelle les données sont transférées.", + ], + ['plugin_data_import_settings_on_duplicate_key_help', 'En savoir plus sur le paramètre "En cas de clé dupliquée"'], ]; diff --git a/webapp/packages/plugin-data-import/src/locales/it.ts b/webapp/packages/plugin-data-import/src/locales/it.ts index 3c505d522f..9de9dab07e 100644 --- a/webapp/packages/plugin-data-import/src/locales/it.ts +++ b/webapp/packages/plugin-data-import/src/locales/it.ts @@ -4,4 +4,24 @@ export default [ ['plugin_data_import_process_success', 'Data imported successfully'], ['plugin_data_import_process_fail', 'Data import failed'], ['plugin_data_import_process_file_processing_step_message', 'File uploaded, processing...'], + ['plugin_data_import_settings_on_duplicate_key', 'On duplicate key'], + ['plugin_data_import_settings_use_bulk_load', 'Use bulk load'], + ['plugin_data_import_settings_use_bulk_load_title', 'Use bulk load for faster import'], + ['plugin_data_import_settings_use_transactions', 'Use transactions'], + [ + 'plugin_data_import_settings_use_transactions_title', + 'Execute the import within a database transaction. If the import fails, all changes can be rolled back', + ], + + [ + 'plugin_data_import_settings_on_duplicate_key_title', + 'Choose how to handle rows that already exist in the target table based on a primary or unique key', + ], + ['plugin_data_import_settings_on_duplicate_key_placeholder', 'None'], + ['plugin_data_import_settings_open_new_connection', 'Open new connection'], + [ + 'plugin_data_import_settings_open_new_connection_title', + 'Use this option to speed up data transfer. If selected, a new connection will be opened and the data transfer will not interfere with other calls to the database where data is being transferred to', + ], + ['plugin_data_import_settings_on_duplicate_key_help', 'Learn more about the "On duplicate key" setting'], ]; diff --git a/webapp/packages/plugin-data-import/src/locales/ru.ts b/webapp/packages/plugin-data-import/src/locales/ru.ts index 7e08b40f55..003f0c7c83 100644 --- a/webapp/packages/plugin-data-import/src/locales/ru.ts +++ b/webapp/packages/plugin-data-import/src/locales/ru.ts @@ -4,4 +4,24 @@ export default [ ['plugin_data_import_process_success', 'Данные успешно импортированы'], ['plugin_data_import_process_fail', 'Ошибка импорта данных'], ['plugin_data_import_process_file_processing_step_message', 'Файл загружен, обработка...'], + ['plugin_data_import_settings_on_duplicate_key', 'При дублировании ключа'], + [ + 'plugin_data_import_settings_on_duplicate_key_title', + 'Выберите, как обрабатывать строки, которые уже существуют в целевой таблице на основе первичного или уникального ключа', + ], + + ['plugin_data_import_settings_use_bulk_load', 'Использовать массовую загрузку'], + ['plugin_data_import_settings_use_bulk_load_title', 'Использовать массовую загрузку для более быстрого импорта'], + ['plugin_data_import_settings_use_transactions', 'Использовать транзакции'], + [ + 'plugin_data_import_settings_use_transactions_title', + 'Выполнять импорт в рамках транзакции базы данных. Если импорт не удается, все изменения могут быть отменены', + ], + ['plugin_data_import_settings_on_duplicate_key_placeholder', 'Нет'], + ['plugin_data_import_settings_open_new_connection', 'Открыть новое соединение'], + [ + 'plugin_data_import_settings_open_new_connection_title', + 'Используйте эту опцию, чтобы ускорить передачу данных. Если выбран этот параметр, будет открыто новое соединение, и передача данных не будет мешать другим вызовам к базе данных, в которую передаются данные', + ], + ['plugin_data_import_settings_on_duplicate_key_help', 'Узнать больше о параметре "При дублировании ключа"'], ]; diff --git a/webapp/packages/plugin-data-import/src/locales/vi.ts b/webapp/packages/plugin-data-import/src/locales/vi.ts index 940a3e7a08..e40133daf5 100644 --- a/webapp/packages/plugin-data-import/src/locales/vi.ts +++ b/webapp/packages/plugin-data-import/src/locales/vi.ts @@ -4,4 +4,23 @@ export default [ ['plugin_data_import_process_success', 'Dữ liệu đã được nhập thành công'], ['plugin_data_import_process_fail', 'Nhập dữ liệu thất bại'], ['plugin_data_import_process_file_processing_step_message', 'Tệp đã được tải lên, đang xử lý...'], + ['plugin_data_import_settings_on_duplicate_key', 'Khi trùng lặp khóa'], + [ + 'plugin_data_import_settings_on_duplicate_key_title', + 'Chọn cách xử lý các hàng đã tồn tại trong bảng đích dựa trên khóa chính hoặc khóa duy nhất', + ], + ['plugin_data_import_settings_use_bulk_load', 'Sử dụng tải hàng loạt'], + ['plugin_data_import_settings_use_bulk_load_title', 'Sử dụng tải hàng loạt để nhập nhanh hơn'], + ['plugin_data_import_settings_use_transactions', 'Sử dụng giao dịch'], + [ + 'plugin_data_import_settings_use_transactions_title', + 'Thực hiện nhập trong một giao dịch cơ sở dữ liệu. Nếu nhập thất bại, tất cả các thay đổi có thể được hoàn tác', + ], + ['plugin_data_import_settings_on_duplicate_key_placeholder', 'Không có'], + ['plugin_data_import_settings_open_new_connection', 'Mở kết nối mới'], + [ + 'plugin_data_import_settings_open_new_connection_title', + 'Sử dụng tùy chọn này để tăng tốc độ truyền dữ liệu. Nếu được chọn, một kết nối mới sẽ được mở và việc truyền dữ liệu sẽ không ảnh hưởng đến các cuộc gọi khác đến cơ sở dữ liệu nơi dữ liệu đang được truyền đến', + ], + ['plugin_data_import_settings_on_duplicate_key_help', 'Tìm hiểu thêm về cài đặt "Khi trùng lặp khóa"'], ]; diff --git a/webapp/packages/plugin-data-import/src/locales/zh.ts b/webapp/packages/plugin-data-import/src/locales/zh.ts index f39b85c3b9..99e7b83404 100644 --- a/webapp/packages/plugin-data-import/src/locales/zh.ts +++ b/webapp/packages/plugin-data-import/src/locales/zh.ts @@ -4,4 +4,17 @@ export default [ ['plugin_data_import_process_success', '数据导入成功'], ['plugin_data_import_process_fail', '数据导入失败'], ['plugin_data_import_process_file_processing_step_message', '文件已上传,正在处理...'], + ['plugin_data_import_settings_on_duplicate_key', '当重复键时'], + ['plugin_data_import_settings_on_duplicate_key_title', '选择如何处理目标表中已存在的行,基于主键或唯一键'], + ['plugin_data_import_settings_use_bulk_load', '使用批量加载'], + ['plugin_data_import_settings_use_bulk_load_title', '使用批量加载以更快地导入数据'], + ['plugin_data_import_settings_use_transactions', '使用事务'], + ['plugin_data_import_settings_use_transactions_title', '在数据库事务中执行导入。如果导入失败,所有更改都可以回滚'], + ['plugin_data_import_settings_on_duplicate_key_placeholder', '无'], + ['plugin_data_import_settings_open_new_connection', '打开新连接'], + [ + 'plugin_data_import_settings_open_new_connection_title', + '使用此选项可加快数据传输。如果选中,将打开一个新连接,数据传输不会干扰对目标数据库的其他调用。', + ], + ['plugin_data_import_settings_on_duplicate_key_help', '了解有关“当重复键时”设置的更多信息'], ]; diff --git a/webapp/packages/plugin-data-import/src/module.ts b/webapp/packages/plugin-data-import/src/module.ts index ef3ca5bf94..49423eca56 100644 --- a/webapp/packages/plugin-data-import/src/module.ts +++ b/webapp/packages/plugin-data-import/src/module.ts @@ -10,6 +10,7 @@ import { Dependency, ModuleRegistry, proxy, Bootstrap } from '@cloudbeaver/core- import { LocaleService } from './LocaleService.js'; import { DataImportService } from './DataImportService.js'; import { DataImportProcessorsResource } from './DataImportProcessorsResource.js'; +import { DataImportDriverConfigurationResource } from './DataImportDriverConfigurationResource.js'; import { DataImportSettingsService } from './DataImportSettingsService.js'; import { DataImportBootstrap } from './DataImportBootstrap.js'; @@ -25,6 +26,7 @@ export default ModuleRegistry.add({ .addSingleton(Bootstrap, LocaleService) .addSingleton(DataImportService) .addSingleton(DataImportProcessorsResource) + .addSingleton(DataImportDriverConfigurationResource) .addSingleton(DataImportSettingsService); }, }); diff --git a/webapp/packages/plugin-data-import/tsconfig.json b/webapp/packages/plugin-data-import/tsconfig.json index 50882dab41..8e74883116 100644 --- a/webapp/packages/plugin-data-import/tsconfig.json +++ b/webapp/packages/plugin-data-import/tsconfig.json @@ -16,6 +16,9 @@ { "path": "../core-cli" }, + { + "path": "../core-connections" + }, { "path": "../core-di" }, diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 6b48b4296c..4f2ef18c0b 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -3176,6 +3176,7 @@ __metadata: dependencies: "@cloudbeaver/core-blocks": "workspace:*" "@cloudbeaver/core-cli": "workspace:*" + "@cloudbeaver/core-connections": "workspace:*" "@cloudbeaver/core-di": "workspace:*" "@cloudbeaver/core-dialogs": "workspace:*" "@cloudbeaver/core-events": "workspace:*" From 707cb3ea417cc8e81e65cf4b0ced5a248570c8cb Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 11 Aug 2026 19:42:03 +0200 Subject: [PATCH 7/9] dbeaver/pro#10205 removes nanoid CVE (#4543) * dbeaver/pro#10205 removes nanoid CVE * dbeaver/pro#10205 fixes image-size CVE with updating LESS --------- Co-authored-by: mr-anton-t <42037741+mr-anton-t@users.noreply.github.com> --- webapp/package.json | 4 +- webapp/yarn.lock | 133 ++++++++++++++++++++++++++++---------------- 2 files changed, 89 insertions(+), 48 deletions(-) diff --git a/webapp/package.json b/webapp/package.json index 092202e240..fd998ef7f1 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -22,7 +22,9 @@ "js-yaml": ">=5.2.2", "brace-expansion": ">=5.0.9", "axios": ">=1.18.0", - "postcss": ">=8.5.18" + "postcss": ">=8.5.18", + "nanoid": ">=3.3.17", + "less": ">=4.7.0" }, "scripts": { "test": "dbeaver-test", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 4f2ef18c0b..dab4dea9cf 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -11796,6 +11796,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:2": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" @@ -11808,6 +11817,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:^3.2.6": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + "decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -13943,6 +13961,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.4.4": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + "iconv-lite@npm:^0.7.0": version: 0.7.2 resolution: "iconv-lite@npm:0.7.2" @@ -13998,15 +14025,6 @@ __metadata: languageName: node linkType: hard -"image-size@npm:~0.5.0": - version: 0.5.5 - resolution: "image-size@npm:0.5.5" - bin: - image-size: bin/image-size.js - checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c - languageName: node - linkType: hard - "immutable@npm:>=5.1.8": version: 5.1.9 resolution: "immutable@npm:5.1.9" @@ -14839,37 +14857,37 @@ __metadata: languageName: node linkType: hard -"less@npm:^4.2.0": - version: 4.6.4 - resolution: "less@npm:4.6.4" +"less@npm:>=4.7.0": + version: 4.8.1 + resolution: "less@npm:4.8.1" dependencies: copy-anything: "npm:^3.0.5" errno: "npm:^0.1.1" graceful-fs: "npm:^4.1.2" - image-size: "npm:~0.5.0" - make-dir: "npm:^2.1.0" + make-dir: "npm:^5.1.0" mime: "npm:^1.4.1" needle: "npm:^3.1.0" parse-node-version: "npm:^1.0.1" + probe-image-size: "npm:^7.2.3" source-map: "npm:~0.6.0" dependenciesMeta: errno: optional: true graceful-fs: optional: true - image-size: - optional: true make-dir: optional: true mime: optional: true needle: optional: true + probe-image-size: + optional: true source-map: optional: true bin: lessc: bin/lessc - checksum: 10c0/34fc96e617f1c8b9bff019ffcab6304550d733fdb5daaa4a69dd404d83aa8566c21d8905bbb75f025334875188f38126edd4af10604e9ee634f43f6d41430837 + checksum: 10c0/41fbad950e9d5110bd86c94726a57eb771e2dfc6eb82aa687dd153f9f463c8707cb3b4e89144d1617bbf026ff7dc57cea7e7a33dfbe959565c9cc35a9d480808 languageName: node linkType: hard @@ -15207,13 +15225,10 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: "npm:^4.0.1" - semver: "npm:^5.6.0" - checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 +"make-dir@npm:^5.1.0": + version: 5.1.0 + resolution: "make-dir@npm:5.1.0" + checksum: 10c0/b8dc9e831e9941db84b63c0ba7dc7c8c7e92704d4fada300fc86293bea6491496b95208d6f98ec78b87f004e26abf143730dd8050920b88ee4b8bbe1eb14d661 languageName: node linkType: hard @@ -16139,7 +16154,14 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.3": +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -16193,12 +16215,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.16": - version: 3.3.16 - resolution: "nanoid@npm:3.3.16" +"nanoid@npm:>=3.3.17": + version: 6.0.1 + resolution: "nanoid@npm:6.0.1" bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/bbf2dcffe22d2b62d16de2711752070b539c0f644c7916f823ad6521986b2078cbe524f2d6240f58c46e9141ea0c7b87a029e100c0f7f175228cacaf30e41bba + nanoid: bin/nanoid.js + checksum: 10c0/5b362ad9822388dfebdf655849c76d3539e074d1003fbe6eb5dff8687faf93a9abbb19bdc5d134b9b8599f875f9b091feacfd7099b34b5fef23bc3f5be41dd10 languageName: node linkType: hard @@ -16209,6 +16231,19 @@ __metadata: languageName: node linkType: hard +"needle@npm:^2.5.2": + version: 2.9.1 + resolution: "needle@npm:2.9.1" + dependencies: + debug: "npm:^3.2.6" + iconv-lite: "npm:^0.4.4" + sax: "npm:^1.2.4" + bin: + needle: ./bin/needle + checksum: 10c0/65a7eaeaf4ca3410de492957474592af9838e02875273d9232ff6cff331393c58a95e48c592bd9a05f575e5bb9b08543d6cfd19eb96595dbd3d7da2c5fe1accb + languageName: node + linkType: hard + "needle@npm:^3.1.0": version: 3.5.0 resolution: "needle@npm:3.5.0" @@ -17027,13 +17062,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf - languageName: node - linkType: hard - "possible-typed-array-names@npm:^1.0.0, possible-typed-array-names@npm:^1.1.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -17182,6 +17210,17 @@ __metadata: languageName: node linkType: hard +"probe-image-size@npm:^7.2.3": + version: 7.3.0 + resolution: "probe-image-size@npm:7.3.0" + dependencies: + lodash.merge: "npm:^4.6.2" + needle: "npm:^2.5.2" + stream-parser: "npm:~0.3.1" + checksum: 10c0/92a1c11fbb6149c0122852a179a54d9edda9f7a5084e837aa529d30b7a213120771356e72547bb18a4e183c8896b83b53380b232ed0a97594d2d80c97cf9a127 + languageName: node + linkType: hard + "proc-log@npm:^6.0.0": version: 6.1.0 resolution: "proc-log@npm:6.1.0" @@ -18230,7 +18269,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -18282,15 +18321,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.6.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - "semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -18698,6 +18728,15 @@ __metadata: languageName: node linkType: hard +"stream-parser@npm:~0.3.1": + version: 0.3.1 + resolution: "stream-parser@npm:0.3.1" + dependencies: + debug: "npm:2" + checksum: 10c0/585508801423bd6c53f6dda9d78e4b743a08ab72e8e2680431fa855ef950e59c849ec2838f2a00c59af655ff8463e90f660f9169a816e63a3ca159cf713bae5c + languageName: node + linkType: hard + "strict-event-emitter@npm:^0.5.1": version: 0.5.1 resolution: "strict-event-emitter@npm:0.5.1" From 2781ec1eaabb0e2ce4a22fe7a3466e2208b132d8 Mon Sep 17 00:00:00 2001 From: dbeaver-devops <94534301+dbeaver-devops@users.noreply.github.com> Date: Tue, 11 Aug 2026 21:11:20 +0200 Subject: [PATCH 8/9] dbeaver/pro#10231 26.2.0 version bump --- server/bundles/io.cloudbeaver.model.cli/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.model.cli/pom.xml | 2 +- server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.model/pom.xml | 2 +- server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.product.ce/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml | 2 +- server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.server.ce/pom.xml | 2 +- server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.server/pom.xml | 2 +- .../bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.admin/pom.xml | 2 +- server/bundles/io.cloudbeaver.service.ai/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.ai/pom.xml | 2 +- .../bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.auth/pom.xml | 2 +- .../io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.data.transfer/pom.xml | 2 +- server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.fs/pom.xml | 2 +- .../io.cloudbeaver.service.ldap.auth/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.ldap.auth/pom.xml | 2 +- .../io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.metadata/pom.xml | 2 +- .../io.cloudbeaver.service.rm.nio/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.rm.nio/pom.xml | 2 +- server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.rm/pom.xml | 2 +- .../io.cloudbeaver.service.security/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.service.security/pom.xml | 2 +- server/bundles/io.cloudbeaver.slf4j/META-INF/MANIFEST.MF | 4 ++-- server/bundles/io.cloudbeaver.slf4j/pom.xml | 2 +- server/features/io.cloudbeaver.ce.drivers.feature/feature.xml | 2 +- server/features/io.cloudbeaver.ce.drivers.feature/pom.xml | 2 +- server/features/io.cloudbeaver.product.ce.feature/feature.xml | 2 +- server/features/io.cloudbeaver.product.ce.feature/pom.xml | 2 +- server/features/io.cloudbeaver.server.feature/feature.xml | 2 +- server/features/io.cloudbeaver.server.feature/pom.xml | 2 +- server/features/io.cloudbeaver.ws.feature/feature.xml | 2 +- server/features/io.cloudbeaver.ws.feature/pom.xml | 2 +- server/product/web-server/CloudbeaverServer.product | 2 +- server/product/web-server/pom.xml | 2 +- webapp/packages/product-default/package.json | 2 +- 45 files changed, 62 insertions(+), 62 deletions(-) diff --git a/server/bundles/io.cloudbeaver.model.cli/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.model.cli/META-INF/MANIFEST.MF index b336d77498..cb80e68c9b 100644 --- a/server/bundles/io.cloudbeaver.model.cli/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.model.cli/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Model Bundle-SymbolicName: io.cloudbeaver.model.cli;singleton:=true -Bundle-Version: 1.0.16.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.17.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: org.jkiss.dbeaver.model.cli;visibility:=reexport diff --git a/server/bundles/io.cloudbeaver.model.cli/pom.xml b/server/bundles/io.cloudbeaver.model.cli/pom.xml index 10cb558a35..b598e91c23 100644 --- a/server/bundles/io.cloudbeaver.model.cli/pom.xml +++ b/server/bundles/io.cloudbeaver.model.cli/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.model.cli - 1.0.16-SNAPSHOT + 1.0.17-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF index 7d93bc3174..f7f22f0654 100644 --- a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Model Bundle-SymbolicName: io.cloudbeaver.model;singleton:=true -Bundle-Version: 1.0.107.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.108.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: org.jkiss.dbeaver.data.gis;visibility:=reexport, diff --git a/server/bundles/io.cloudbeaver.model/pom.xml b/server/bundles/io.cloudbeaver.model/pom.xml index f43042567e..9fc6f067c2 100644 --- a/server/bundles/io.cloudbeaver.model/pom.xml +++ b/server/bundles/io.cloudbeaver.model/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.model - 1.0.107-SNAPSHOT + 1.0.108-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF index 969b9dc8f5..741f06a075 100644 --- a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Community Product Bundle-SymbolicName: io.cloudbeaver.product.ce;singleton:=true -Bundle-Version: 26.1.5.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 26.2.0.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server.ce diff --git a/server/bundles/io.cloudbeaver.product.ce/pom.xml b/server/bundles/io.cloudbeaver.product.ce/pom.xml index 5056697507..0bcd25fe5f 100644 --- a/server/bundles/io.cloudbeaver.product.ce/pom.xml +++ b/server/bundles/io.cloudbeaver.product.ce/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.product.ce - 26.1.5-SNAPSHOT + 26.2.0-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF index 75531db098..2da719e274 100644 --- a/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Cloudbeaver Base JDBC drivers Bundle-SymbolicName: io.cloudbeaver.resources.drivers.base;singleton:=true -Bundle-Version: 1.0.152.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.153.qualifier +Bundle-Release-Date: 20260831 Bundle-Vendor: DBeaver Corp Bundle-ActivationPolicy: lazy Automatic-Module-Name: io.cloudbeaver.resources.drivers.base diff --git a/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml b/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml index 7d8e62c32a..c0ddff6fff 100644 --- a/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml +++ b/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml @@ -9,6 +9,6 @@ ../ io.cloudbeaver.resources.drivers.base - 1.0.152-SNAPSHOT + 1.0.153-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF index 78c3cb0098..c8b8040bf4 100644 --- a/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.server.ce/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: CloudBeaver Community Bundle-SymbolicName: io.cloudbeaver.server.ce;singleton:=true -Bundle-Version: 26.1.5.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 26.2.0.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Bundle-Activator: io.cloudbeaver.server.CBPlatformActivator diff --git a/server/bundles/io.cloudbeaver.server.ce/pom.xml b/server/bundles/io.cloudbeaver.server.ce/pom.xml index b927fc5298..0163214cbb 100644 --- a/server/bundles/io.cloudbeaver.server.ce/pom.xml +++ b/server/bundles/io.cloudbeaver.server.ce/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.server.ce - 26.1.5-SNAPSHOT + 26.2.0-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF index 4ec1ac0927..b15dea48da 100644 --- a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Server Bundle-SymbolicName: io.cloudbeaver.server;singleton:=true -Bundle-Version: 26.1.5.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 26.2.0.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: org.jkiss.dbeaver.model.sql;visibility:=reexport, diff --git a/server/bundles/io.cloudbeaver.server/pom.xml b/server/bundles/io.cloudbeaver.server/pom.xml index bf23aa36bd..d38f7535a6 100644 --- a/server/bundles/io.cloudbeaver.server/pom.xml +++ b/server/bundles/io.cloudbeaver.server/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.server - 26.1.5-SNAPSHOT + 26.2.0-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF index f7ac28dd44..b117b1ce66 100644 --- a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Service - Administration Bundle-SymbolicName: io.cloudbeaver.service.admin;singleton:=true -Bundle-Version: 1.0.151.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.152.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server.ce, diff --git a/server/bundles/io.cloudbeaver.service.admin/pom.xml b/server/bundles/io.cloudbeaver.service.admin/pom.xml index cfe04feaf9..0dabf0a492 100644 --- a/server/bundles/io.cloudbeaver.service.admin/pom.xml +++ b/server/bundles/io.cloudbeaver.service.admin/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.admin - 1.0.151-SNAPSHOT + 1.0.152-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.ai/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.ai/META-INF/MANIFEST.MF index 17d80915c5..5bf4915c88 100644 --- a/server/bundles/io.cloudbeaver.service.ai/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.ai/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Cloudbeaver AI Integration Bundle-SymbolicName: io.cloudbeaver.service.ai;singleton:=true -Bundle-Version: 1.0.1.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.2.qualifier +Bundle-Release-Date: 20260831 Bundle-Vendor: DBeaver Corp Bundle-ActivationPolicy: lazy Automatic-Module-Name: io.cloudbeaver.service.ai diff --git a/server/bundles/io.cloudbeaver.service.ai/pom.xml b/server/bundles/io.cloudbeaver.service.ai/pom.xml index 75a705f1ac..7fe8d7d0b5 100644 --- a/server/bundles/io.cloudbeaver.service.ai/pom.xml +++ b/server/bundles/io.cloudbeaver.service.ai/pom.xml @@ -10,6 +10,6 @@ ../ io.cloudbeaver.service.ai - 1.0.1-SNAPSHOT + 1.0.2-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF index d30ba84b8f..4c02a83f6d 100644 --- a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Service - Authentication Bundle-SymbolicName: io.cloudbeaver.service.auth;singleton:=true -Bundle-Version: 1.0.151.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.152.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server.ce diff --git a/server/bundles/io.cloudbeaver.service.auth/pom.xml b/server/bundles/io.cloudbeaver.service.auth/pom.xml index 0cd4f20018..9a4ff2535b 100644 --- a/server/bundles/io.cloudbeaver.service.auth/pom.xml +++ b/server/bundles/io.cloudbeaver.service.auth/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.auth - 1.0.151-SNAPSHOT + 1.0.152-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF index 03fcc9c3f9..b0ddf52b54 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Service - Data Transfer Bundle-SymbolicName: io.cloudbeaver.service.data.transfer;singleton:=true -Bundle-Version: 1.0.152.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.153.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server.ce, diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml b/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml index 7d962c4a6f..a84a473402 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml +++ b/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.data.transfer - 1.0.152-SNAPSHOT + 1.0.153-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF index c8bdbd51a9..56d2a294cd 100644 --- a/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.fs/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Service - File System Bundle-SymbolicName: io.cloudbeaver.service.fs;singleton:=true -Bundle-Version: 1.0.69.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.70.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server.ce, diff --git a/server/bundles/io.cloudbeaver.service.fs/pom.xml b/server/bundles/io.cloudbeaver.service.fs/pom.xml index 5a85715c9c..21e19f70c5 100644 --- a/server/bundles/io.cloudbeaver.service.fs/pom.xml +++ b/server/bundles/io.cloudbeaver.service.fs/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.fs - 1.0.69-SNAPSHOT + 1.0.70-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.ldap.auth/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.ldap.auth/META-INF/MANIFEST.MF index b893ff9e65..64936d663c 100644 --- a/server/bundles/io.cloudbeaver.service.ldap.auth/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.ldap.auth/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Name: Cloudbeaver Web Service - LDAP Bundle-Vendor: DBeaver Corp Bundle-SymbolicName: io.cloudbeaver.service.ldap.auth;singleton:=true -Bundle-Version: 1.0.34.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.35.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: org.jkiss.dbeaver.model;visibility:=reexport, diff --git a/server/bundles/io.cloudbeaver.service.ldap.auth/pom.xml b/server/bundles/io.cloudbeaver.service.ldap.auth/pom.xml index f6377e2a55..5b6bccde3e 100644 --- a/server/bundles/io.cloudbeaver.service.ldap.auth/pom.xml +++ b/server/bundles/io.cloudbeaver.service.ldap.auth/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.ldap.auth - 1.0.34-SNAPSHOT + 1.0.35-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF index eff56f7a8b..c5dbb95d8e 100644 --- a/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Service - Metadata Bundle-SymbolicName: io.cloudbeaver.service.metadata;singleton:=true -Bundle-Version: 1.0.155.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.156.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server diff --git a/server/bundles/io.cloudbeaver.service.metadata/pom.xml b/server/bundles/io.cloudbeaver.service.metadata/pom.xml index 72054b79e0..3966d707fe 100644 --- a/server/bundles/io.cloudbeaver.service.metadata/pom.xml +++ b/server/bundles/io.cloudbeaver.service.metadata/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.metadata - 1.0.155-SNAPSHOT + 1.0.156-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.rm.nio/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.rm.nio/META-INF/MANIFEST.MF index 533ccf5ba0..f021e3afe7 100644 --- a/server/bundles/io.cloudbeaver.service.rm.nio/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.rm.nio/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Resource manager NIO implementation Bundle-SymbolicName: io.cloudbeaver.service.rm.nio;singleton:=true -Bundle-Version: 1.0.69.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.70.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.model, diff --git a/server/bundles/io.cloudbeaver.service.rm.nio/pom.xml b/server/bundles/io.cloudbeaver.service.rm.nio/pom.xml index b3ab5f0bc7..99093176aa 100644 --- a/server/bundles/io.cloudbeaver.service.rm.nio/pom.xml +++ b/server/bundles/io.cloudbeaver.service.rm.nio/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.rm.nio - 1.0.69-SNAPSHOT + 1.0.70-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF index 98a78a9dd8..6e00394636 100644 --- a/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.rm/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: Cloudbeaver Web Service - Resource manager Bundle-SymbolicName: io.cloudbeaver.service.rm;singleton:=true -Bundle-Version: 1.0.104.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.105.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: io.cloudbeaver.server, diff --git a/server/bundles/io.cloudbeaver.service.rm/pom.xml b/server/bundles/io.cloudbeaver.service.rm/pom.xml index 3c5a0803c1..bbd493d2d7 100644 --- a/server/bundles/io.cloudbeaver.service.rm/pom.xml +++ b/server/bundles/io.cloudbeaver.service.rm/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.rm - 1.0.104-SNAPSHOT + 1.0.105-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF index a8c26119c4..6cc7900e70 100644 --- a/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.security/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Name: Cloudbeaver Web Service - Security Bundle-Vendor: DBeaver Corp Bundle-SymbolicName: io.cloudbeaver.service.security;singleton:=true -Bundle-Version: 1.0.107.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.108.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Require-Bundle: org.jkiss.dbeaver.model;visibility:=reexport, diff --git a/server/bundles/io.cloudbeaver.service.security/pom.xml b/server/bundles/io.cloudbeaver.service.security/pom.xml index f1f632eb9a..d5e4850d2c 100644 --- a/server/bundles/io.cloudbeaver.service.security/pom.xml +++ b/server/bundles/io.cloudbeaver.service.security/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.security - 1.0.107-SNAPSHOT + 1.0.108-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.slf4j/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.slf4j/META-INF/MANIFEST.MF index 4703b010f0..fdcee2ba5b 100644 --- a/server/bundles/io.cloudbeaver.slf4j/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.slf4j/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: DBeaver Corp Bundle-Name: CloudBeaver SLF4j Binding Bundle-SymbolicName: io.cloudbeaver.slf4j;singleton:=true -Bundle-Version: 1.0.67.qualifier -Bundle-Release-Date: 20260817 +Bundle-Version: 1.0.68.qualifier +Bundle-Release-Date: 20260831 Bundle-RequiredExecutionEnvironment: JavaSE-21 Bundle-ActivationPolicy: lazy Fragment-Host: slf4j.api diff --git a/server/bundles/io.cloudbeaver.slf4j/pom.xml b/server/bundles/io.cloudbeaver.slf4j/pom.xml index 796c4636a0..f7e797451c 100644 --- a/server/bundles/io.cloudbeaver.slf4j/pom.xml +++ b/server/bundles/io.cloudbeaver.slf4j/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.slf4j - 1.0.67-SNAPSHOT + 1.0.68-SNAPSHOT eclipse-plugin diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml index a822107399..6ad4a1c866 100644 --- a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml +++ b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml b/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml index ebd9500f33..24bc2754b7 100644 --- a/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml +++ b/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml @@ -9,6 +9,6 @@ ../ io.cloudbeaver.ce.drivers.feature - 1.0.175-SNAPSHOT + 1.0.176-SNAPSHOT eclipse-feature diff --git a/server/features/io.cloudbeaver.product.ce.feature/feature.xml b/server/features/io.cloudbeaver.product.ce.feature/feature.xml index 3c961a18ec..10823b1f09 100644 --- a/server/features/io.cloudbeaver.product.ce.feature/feature.xml +++ b/server/features/io.cloudbeaver.product.ce.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.product.ce.feature/pom.xml b/server/features/io.cloudbeaver.product.ce.feature/pom.xml index 6d0e51af67..64e9eb9d0a 100644 --- a/server/features/io.cloudbeaver.product.ce.feature/pom.xml +++ b/server/features/io.cloudbeaver.product.ce.feature/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.product.ce.feature - 26.1.5-SNAPSHOT + 26.2.0-SNAPSHOT eclipse-feature diff --git a/server/features/io.cloudbeaver.server.feature/feature.xml b/server/features/io.cloudbeaver.server.feature/feature.xml index 4fe94cd25f..7f5fc9ce5f 100644 --- a/server/features/io.cloudbeaver.server.feature/feature.xml +++ b/server/features/io.cloudbeaver.server.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.server.feature/pom.xml b/server/features/io.cloudbeaver.server.feature/pom.xml index 0c072944f7..98fba1df8d 100644 --- a/server/features/io.cloudbeaver.server.feature/pom.xml +++ b/server/features/io.cloudbeaver.server.feature/pom.xml @@ -10,6 +10,6 @@ ../ io.cloudbeaver.server.feature - 26.1.5-SNAPSHOT + 26.2.0-SNAPSHOT eclipse-feature diff --git a/server/features/io.cloudbeaver.ws.feature/feature.xml b/server/features/io.cloudbeaver.ws.feature/feature.xml index f43441e638..9ee4f013e6 100644 --- a/server/features/io.cloudbeaver.ws.feature/feature.xml +++ b/server/features/io.cloudbeaver.ws.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.ws.feature/pom.xml b/server/features/io.cloudbeaver.ws.feature/pom.xml index ef7ee8df6d..e4bcef138a 100644 --- a/server/features/io.cloudbeaver.ws.feature/pom.xml +++ b/server/features/io.cloudbeaver.ws.feature/pom.xml @@ -10,6 +10,6 @@ ../ io.cloudbeaver.ws.feature - 1.0.105-SNAPSHOT + 1.0.106-SNAPSHOT eclipse-feature diff --git a/server/product/web-server/CloudbeaverServer.product b/server/product/web-server/CloudbeaverServer.product index 5c2c9bc3ff..2807fc3d96 100644 --- a/server/product/web-server/CloudbeaverServer.product +++ b/server/product/web-server/CloudbeaverServer.product @@ -2,7 +2,7 @@ diff --git a/server/product/web-server/pom.xml b/server/product/web-server/pom.xml index 92e3206c13..768d188920 100644 --- a/server/product/web-server/pom.xml +++ b/server/product/web-server/pom.xml @@ -9,7 +9,7 @@ 1.0.0-SNAPSHOT ../../ - 26.1.5-SNAPSHOT + 26.2.0-SNAPSHOT web-server eclipse-repository Cloudbeaver Server Product diff --git a/webapp/packages/product-default/package.json b/webapp/packages/product-default/package.json index 131af02efe..f96cf0f6c1 100644 --- a/webapp/packages/product-default/package.json +++ b/webapp/packages/product-default/package.json @@ -8,7 +8,7 @@ "public/**/*", "src/**/*.css" ], - "version": "26.1.5", + "version": "26.2.0", "description": "CloudBeaver Community", "license": "DBeaver Corp", "exports": { From f2b30d0f1f573b53a7a85774a41f652135635434 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Wed, 12 Aug 2026 09:02:38 +0200 Subject: [PATCH 9/9] dbeaver/pro#10155 Update gson and guava in products --- apps/config-generator/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/config-generator/pom.xml b/apps/config-generator/pom.xml index dde301fefb..43af2a1870 100644 --- a/apps/config-generator/pom.xml +++ b/apps/config-generator/pom.xml @@ -18,7 +18,7 @@ com.google.code.gson gson - 2.13.2 + 2.14.0