From bbad1dfc716298e98d5713cef50c1fb31a2812e9 Mon Sep 17 00:00:00 2001 From: naumov Date: Fri, 17 Jul 2026 00:37:33 +0200 Subject: [PATCH 1/6] dbeaver/pro#4425 add controlled mode --- .../packages/core-ui/src/Tabs/TabsState.tsx | 25 +++++++++++--- .../Users/UsersAdministrationService.ts | 30 ++++++++++++++-- .../package.json | 1 + .../SettingsAdministrationPluginBootstrap.ts | 34 ++++++++++++++++--- .../tsconfig.json | 3 ++ 5 files changed, 83 insertions(+), 10 deletions(-) diff --git a/webapp/packages/core-ui/src/Tabs/TabsState.tsx b/webapp/packages/core-ui/src/Tabs/TabsState.tsx index 985217619db..3c48037cc40 100644 --- a/webapp/packages/core-ui/src/Tabs/TabsState.tsx +++ b/webapp/packages/core-ui/src/Tabs/TabsState.tsx @@ -66,6 +66,8 @@ export const TabsState = observer(function TabsState>({ const context = useDataContext(); const props = useMemo(() => rest as any as T, [...Object.values(rest)]); + const controlled = currentTabId !== undefined; + let displayed: string[] = []; if (container) { @@ -85,11 +87,19 @@ export const TabsState = observer(function TabsState>({ const [closeExecutor] = useState(() => new Executor>()); const [openExecutor] = useState(() => new Executor>()); + function select(id: string | null | undefined): void | undefined { + if (isNotNullDefined(id) && id !== currentTabId) { + openExecutor.execute({ tabId: id, props }); + } + } + const store = useTabStore({ defaultSelectedId: selectedId ?? null, orientation, selectOnMove: false, focusLoop: false, + selectedId: controlled ? currentTabId : undefined, + setSelectedId: controlled ? select : undefined, }); const selected = useStoreState(store, 'selectedId'); @@ -109,12 +119,12 @@ export const TabsState = observer(function TabsState>({ selected, store, tabList, + controlled, }, ); useEffect(() => { if (isNotNullDefined(currentTabId)) { - dynamic.store.setSelectedId(currentTabId); dynamic.selectedId = currentTabId; } }, [currentTabId]); @@ -134,15 +144,18 @@ export const TabsState = observer(function TabsState>({ executor: openExecutor, handlers: [ function openHandler(data, contexts) { - dynamic.open?.(data); if (dynamic.selectedId === data.tabId) { ExecutorInterrupter.interrupt(contexts); return; } + dynamic.selectedId = data.tabId; - if (dynamic.store.getState().selectedId !== data.tabId) { + + if (!dynamic.controlled && dynamic.store.getState().selectedId !== data.tabId) { dynamic.store.setSelectedId(data.tabId); } + + dynamic.open?.(data); }, ], }); @@ -159,6 +172,10 @@ export const TabsState = observer(function TabsState>({ const currentSelectedId = selected; useEffect(() => { + if (controlled) { + return; + } + if (!isNotNullDefined(currentSelectedId) || dynamic.selectedId === currentSelectedId) { return; } @@ -167,7 +184,7 @@ export const TabsState = observer(function TabsState>({ tabId: currentSelectedId, props, }); - }, [currentSelectedId]); + }, [currentSelectedId, controlled]); const value = useObservableRef>( () => ({ 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 dce23314acd..1731ec51859 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts @@ -9,9 +9,10 @@ import React from 'react'; import { AdministrationItemService, type IAdministrationItem } from '@cloudbeaver/core-administration'; import { type AdminUser, TeamsResource, UsersResource } from '@cloudbeaver/core-authentication'; -import { PlaceholderContainer } from '@cloudbeaver/core-blocks'; +import { ConfirmationDialog, PlaceholderContainer } from '@cloudbeaver/core-blocks'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { TabsContainer } from '@cloudbeaver/core-ui'; +import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs'; import { CreateTeamService } from './Teams/TeamsTable/CreateTeamService.js'; import { EUsersAdministrationSub, UsersAdministrationNavigationService } from './UsersAdministrationNavigationService.js'; @@ -36,7 +37,7 @@ export interface IUserDetailsInfoProps { user: AdminUser; } -@injectable(() => [AdministrationItemService, CreateUserService, TeamsResource, CreateTeamService, UsersResource]) +@injectable(() => [AdministrationItemService, CreateUserService, TeamsResource, CreateTeamService, UsersResource, CommonDialogService]) export class UsersAdministrationService extends Bootstrap { readonly tabsContainer: TabsContainer; readonly userDetailsInfoPlaceholder: PlaceholderContainer; @@ -49,6 +50,7 @@ export class UsersAdministrationService extends Bootstrap { private readonly teamsResource: TeamsResource, private readonly createTeamService: CreateTeamService, private readonly usersResource: UsersResource, + private readonly commonDialogService: CommonDialogService, ) { super(); this.userDetailsInfoPlaceholder = new PlaceholderContainer(); @@ -66,10 +68,12 @@ export class UsersAdministrationService extends Bootstrap { }, { name: EUsersAdministrationSub.Users, + canDeActivate: () => this.handleDeactivate(EUsersAdministrationSub.Users), onDeActivate: this.cancelUserCreate.bind(this), }, { name: EUsersAdministrationSub.Teams, + canDeActivate: () => this.handleDeactivate(EUsersAdministrationSub.Teams), onActivate: this.loadTeams.bind(this), onDeActivate: this.cancelTeamCreate.bind(this), }, @@ -81,6 +85,28 @@ export class UsersAdministrationService extends Bootstrap { this.userDetailsInfoPlaceholder.add(UserCredentialsList, 0); } + private async handleDeactivate(sub: EUsersAdministrationSub) { + if (sub === EUsersAdministrationSub.Users || sub === EUsersAdministrationSub.Teams) { + const users = sub === EUsersAdministrationSub.Users; + const edited = users ? this.createUserService.state?.isChanged : this.createTeamService.data?.isChanged; + + if (edited) { + const { status } = await this.commonDialogService.open(ConfirmationDialog, { + title: 'ui_save_reminder', + message: 'ui_are_you_sure', + }); + + if (status === DialogueStateResult.Rejected) { + return false; + } + } + + return true; + } + + return true; + } + private cancelUserCreate(param: string | null, configurationWizard: boolean, outside: boolean) { if (param === 'create') { this.createUserService.close(); diff --git a/webapp/packages/plugin-settings-administration/package.json b/webapp/packages/plugin-settings-administration/package.json index 3c15980130f..c651b6fda0c 100644 --- a/webapp/packages/plugin-settings-administration/package.json +++ b/webapp/packages/plugin-settings-administration/package.json @@ -25,6 +25,7 @@ "@cloudbeaver/core-administration": "workspace:*", "@cloudbeaver/core-blocks": "workspace:*", "@cloudbeaver/core-di": "workspace:*", + "@cloudbeaver/core-dialogs": "workspace:*", "@cloudbeaver/core-events": "workspace:*", "@cloudbeaver/core-localization": "workspace:*", "@cloudbeaver/core-settings": "workspace:*", diff --git a/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts b/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts index 949879a6666..0ef3812929a 100644 --- a/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts +++ b/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts @@ -1,20 +1,29 @@ /* * 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 { AdministrationItemService, AdministrationItemType } from '@cloudbeaver/core-administration'; -import { importLazyComponent } from '@cloudbeaver/core-blocks'; +import { ConfirmationDialog, importLazyComponent } from '@cloudbeaver/core-blocks'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; +import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs'; +import type { IEditableSettingsSource } from '@cloudbeaver/core-settings'; + +import { SettingsAdministrationService } from './SettingsAdministrationService.js'; const SettingsAdministration = importLazyComponent(() => import('./SettingsAdministration.js').then(module => module.SettingsAdministration)); const SettingsDrawerItem = importLazyComponent(() => import('./SettingsDrawerItem.js').then(module => module.SettingsDrawerItem)); -@injectable(() => [AdministrationItemService]) +@injectable(() => [AdministrationItemService, SettingsAdministrationService, CommonDialogService]) export class SettingsAdministrationPluginBootstrap extends Bootstrap { - constructor(private readonly administrationItemService: AdministrationItemService) { + constructor( + private readonly administrationItemService: AdministrationItemService, + private readonly settingsAdministrationService: SettingsAdministrationService, + private readonly commonDialogService: CommonDialogService, + ) { super(); } @@ -23,6 +32,23 @@ export class SettingsAdministrationPluginBootstrap extends Bootstrap { name: 'settings', type: AdministrationItemType.Administration, order: 3, + canDeActivate: async () => { + const displayed = this.settingsAdministrationService.tabsContainer.getDisplayed(); + const edited = displayed.some(tab => (tab.options?.source as IEditableSettingsSource).isEdited()); + + if (edited) { + const { status } = await this.commonDialogService.open(ConfirmationDialog, { + title: 'ui_save_reminder', + message: 'ui_are_you_sure', + }); + + if (status === DialogueStateResult.Rejected) { + return false; + } + } + + return true; + }, getContentComponent: () => SettingsAdministration, getDrawerComponent: () => SettingsDrawerItem, }); diff --git a/webapp/packages/plugin-settings-administration/tsconfig.json b/webapp/packages/plugin-settings-administration/tsconfig.json index 302f30fbbd5..14193ffd1a4 100644 --- a/webapp/packages/plugin-settings-administration/tsconfig.json +++ b/webapp/packages/plugin-settings-administration/tsconfig.json @@ -22,6 +22,9 @@ { "path": "../core-di" }, + { + "path": "../core-dialogs" + }, { "path": "../core-events" }, From 67d0e859315cff2efd512fecd4af20272594bf6d Mon Sep 17 00:00:00 2001 From: naumov Date: Fri, 17 Jul 2026 11:54:32 +0200 Subject: [PATCH 2/6] dbeaver/pro#4425 update yarn lock --- webapp/yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 0e583545f97..46c1bd7ab64 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -4195,6 +4195,7 @@ __metadata: "@cloudbeaver/core-blocks": "workspace:*" "@cloudbeaver/core-cli": "workspace:*" "@cloudbeaver/core-di": "workspace:*" + "@cloudbeaver/core-dialogs": "workspace:*" "@cloudbeaver/core-events": "workspace:*" "@cloudbeaver/core-localization": "workspace:*" "@cloudbeaver/core-settings": "workspace:*" From 8d314ec17602555472593b3043316c4d6a89109f Mon Sep 17 00:00:00 2001 From: naumov Date: Fri, 17 Jul 2026 13:08:29 +0200 Subject: [PATCH 3/6] dbeaver/pro#4425 use controlled state for users --- webapp/packages/core-ui/src/Tabs/TabsState.tsx | 8 +++++--- .../src/Administration/Users/UsersAdministration.tsx | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/webapp/packages/core-ui/src/Tabs/TabsState.tsx b/webapp/packages/core-ui/src/Tabs/TabsState.tsx index 3c48037cc40..b57a3ca2d2a 100644 --- a/webapp/packages/core-ui/src/Tabs/TabsState.tsx +++ b/webapp/packages/core-ui/src/Tabs/TabsState.tsx @@ -149,10 +149,12 @@ export const TabsState = observer(function TabsState>({ return; } - dynamic.selectedId = data.tabId; + if (!dynamic.controlled) { + dynamic.selectedId = data.tabId; - if (!dynamic.controlled && dynamic.store.getState().selectedId !== data.tabId) { - dynamic.store.setSelectedId(data.tabId); + if (dynamic.store.getState().selectedId !== data.tabId) { + dynamic.store.setSelectedId(data.tabId); + } } dynamic.open?.(data); diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministration.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministration.tsx index 847eae7ba5e..f3dac5ec831 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministration.tsx +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministration.tsx @@ -57,7 +57,7 @@ export const UsersAdministration: AdministrationItemContentComponent = observer( } return ( - + Date: Thu, 23 Jul 2026 18:46:51 +0200 Subject: [PATCH 4/6] dbeaver/pro#4425 update copyright --- webapp/packages/core-localization/src/locales/en.ts | 4 ++++ webapp/packages/core-localization/src/locales/fr.ts | 4 ++++ webapp/packages/core-localization/src/locales/it.ts | 4 ++++ webapp/packages/core-localization/src/locales/ru.ts | 4 ++++ webapp/packages/core-localization/src/locales/vi.ts | 4 ++++ webapp/packages/core-localization/src/locales/zh.ts | 4 ++++ .../ConfigurationWizardPagesBootstrapService.ts | 6 ++++-- .../src/Administration/Users/Teams/TeamsTable/TeamEdit.tsx | 7 ++++--- .../src/Administration/Users/UsersAdministrationService.ts | 6 ++++-- .../src/Administration/Users/UsersTable/UserEdit.tsx | 7 ++++--- .../src/SettingsAdministrationPluginBootstrap.ts | 6 ++++-- .../src/UserProfileSettingsPluginBootstrap.ts | 6 ++++-- 12 files changed, 48 insertions(+), 14 deletions(-) diff --git a/webapp/packages/core-localization/src/locales/en.ts b/webapp/packages/core-localization/src/locales/en.ts index 559daa3f15c..36efdb888db 100644 --- a/webapp/packages/core-localization/src/locales/en.ts +++ b/webapp/packages/core-localization/src/locales/en.ts @@ -98,6 +98,10 @@ export default [ ['ui_no_items_placeholder', 'There are no items yet.'], ['ui_search_no_result_placeholder', 'No results have been found.'], ['ui_save_reminder', 'You have unsaved changes.'], + ['ui_discard_changes', 'Discard changes'], + ['ui_discard_changes_message', 'You have unsaved changes. Do you want to discard them?'], + ['ui_discard', 'Discard'], + ['ui_keep_editing', 'Keep editing'], ['ui_yes', 'Yes'], ['ui_no', 'No'], ['ui_select_all', 'Select all'], diff --git a/webapp/packages/core-localization/src/locales/fr.ts b/webapp/packages/core-localization/src/locales/fr.ts index 3c308a13443..bb2dab5b48f 100644 --- a/webapp/packages/core-localization/src/locales/fr.ts +++ b/webapp/packages/core-localization/src/locales/fr.ts @@ -91,6 +91,10 @@ export default [ ['ui_no_items_placeholder', "Il n'y a pas encore d'éléments."], ['ui_search_no_result_placeholder', 'Aucun résultat trouvé.'], ['ui_save_reminder', 'Vous avez des modifications non sauvegardées.'], + ['ui_discard_changes', 'Abandonner les modifications'], + ['ui_discard_changes_message', 'Vous avez des modifications non sauvegardées. Voulez-vous vraiment les abandonner?'], + ['ui_discard', 'Abandonner'], + ['ui_keep_editing', 'Continuer à modifier'], ['ui_yes', 'Oui'], ['ui_no', 'Non'], ['ui_select_all', 'Tout sélectionner'], diff --git a/webapp/packages/core-localization/src/locales/it.ts b/webapp/packages/core-localization/src/locales/it.ts index 10eab3c6eaf..2554c40b15e 100644 --- a/webapp/packages/core-localization/src/locales/it.ts +++ b/webapp/packages/core-localization/src/locales/it.ts @@ -95,6 +95,10 @@ export default [ ['ui_no_items_placeholder', 'Non ci sono ancora elementi.'], ['ui_search_no_result_placeholder', 'Nessun risultato trovato.'], ['ui_save_reminder', 'Ci sono modifiche non salvate.'], + ['ui_discard_changes', 'Scarta le modifiche'], + ['ui_discard_changes_message', 'Sei sicuro di voler scartare le modifiche?'], + ['ui_discard', 'Scarta'], + ['ui_keep_editing', 'Continua a modificare'], ['ui_yes', 'Sì'], ['ui_no', 'No'], ['ui_select_all', 'Select all'], diff --git a/webapp/packages/core-localization/src/locales/ru.ts b/webapp/packages/core-localization/src/locales/ru.ts index 7ba68fd9f5c..bf901e09faa 100644 --- a/webapp/packages/core-localization/src/locales/ru.ts +++ b/webapp/packages/core-localization/src/locales/ru.ts @@ -95,6 +95,10 @@ export default [ ['ui_no_items_placeholder', 'Вы еще ничего не добавили.'], ['ui_search_no_result_placeholder', 'По вашему запросу ничего не найдено.'], ['ui_save_reminder', 'У вас есть несохраненные изменения.'], + ['ui_discard_changes', 'Отменить изменения'], + ['ui_discard_changes_message', 'Вы собираетесь отменить несохраненные изменения. Вы уверены?'], + ['ui_discard', 'Отменить'], + ['ui_keep_editing', 'Продолжить редактирование'], ['ui_yes', 'Да'], ['ui_no', 'Нет'], ['ui_select_all', 'Выбрать все'], diff --git a/webapp/packages/core-localization/src/locales/vi.ts b/webapp/packages/core-localization/src/locales/vi.ts index 438b20f77ad..451c9c2ed64 100644 --- a/webapp/packages/core-localization/src/locales/vi.ts +++ b/webapp/packages/core-localization/src/locales/vi.ts @@ -97,6 +97,10 @@ export default [ ['ui_no_items_placeholder', 'Chưa có mục nào.'], ['ui_search_no_result_placeholder', 'Không tìm thấy kết quả.'], ['ui_save_reminder', 'Bạn có các thay đổi chưa được lưu.'], + ['ui_discard_changes', 'Bỏ qua các thay đổi'], + ['ui_discard_changes_message', 'Bạn sắp bỏ qua các thay đổi chưa được lưu. Bạn có chắc chắn không?'], + ['ui_discard', 'Bỏ qua'], + ['ui_keep_editing', 'Tiếp tục chỉnh sửa'], ['ui_yes', 'Có'], ['ui_no', 'Không'], ['ui_select_all', 'Chọn tất cả'], diff --git a/webapp/packages/core-localization/src/locales/zh.ts b/webapp/packages/core-localization/src/locales/zh.ts index 1ee842dbdcf..0fd993aa27d 100644 --- a/webapp/packages/core-localization/src/locales/zh.ts +++ b/webapp/packages/core-localization/src/locales/zh.ts @@ -95,6 +95,10 @@ export default [ ['ui_no_items_placeholder', '还没有项目'], ['ui_search_no_result_placeholder', '没有找到结果'], ['ui_save_reminder', '您有未保存的更改'], + ['ui_discard_changes', '放弃更改'], + ['ui_discard_changes_message', '您即将放弃未保存的更改。您确定吗?'], + ['ui_discard', '放弃'], + ['ui_keep_editing', '继续编辑'], ['ui_yes', '是'], ['ui_no', '否'], ['ui_select_all', '选择所有'], diff --git a/webapp/packages/plugin-administration/src/ConfigurationWizard/ConfigurationWizardPagesBootstrapService.ts b/webapp/packages/plugin-administration/src/ConfigurationWizard/ConfigurationWizardPagesBootstrapService.ts index 5744382563b..21ff8ba69a3 100644 --- a/webapp/packages/plugin-administration/src/ConfigurationWizard/ConfigurationWizardPagesBootstrapService.ts +++ b/webapp/packages/plugin-administration/src/ConfigurationWizard/ConfigurationWizardPagesBootstrapService.ts @@ -121,8 +121,10 @@ export class ConfigurationWizardPagesBootstrapService extends Bootstrap { if (!configurationWizard && state?.isChanged) { const { status } = await this.commonDialogService.open(ConfirmationDialog, { - title: 'ui_save_reminder', - message: 'ui_are_you_sure', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/Teams/TeamsTable/TeamEdit.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/Teams/TeamsTable/TeamEdit.tsx index 7919b4473bf..57c4cc11f7c 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/Teams/TeamsTable/TeamEdit.tsx +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/Teams/TeamsTable/TeamEdit.tsx @@ -37,9 +37,10 @@ export const TeamEdit = observer(function TeamEdit({ item }) { async function closeHandler(event, contexts) { if (formState.isChanged && event === 'before') { const { status } = await commonDialogService.open(ConfirmationDialog, { - title: 'ui_save_reminder', - message: 'ui_are_you_sure', - confirmActionText: 'ui_yes', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { 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 1731ec51859..1d4c373e2a0 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersAdministrationService.ts @@ -92,8 +92,10 @@ export class UsersAdministrationService extends Bootstrap { if (edited) { const { status } = await this.commonDialogService.open(ConfirmationDialog, { - title: 'ui_save_reminder', - message: 'ui_are_you_sure', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { diff --git a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/UserEdit.tsx b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/UserEdit.tsx index e42f815543f..9a42322aa6f 100644 --- a/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/UserEdit.tsx +++ b/webapp/packages/plugin-authentication-administration/src/Administration/Users/UsersTable/UserEdit.tsx @@ -39,9 +39,10 @@ export const UserEdit = observer>(function UserEdit async function closeHandler(event, contexts) { if (state.isChanged && event === 'before') { const { status } = await commonDialogService.open(ConfirmationDialog, { - title: 'ui_save_reminder', - message: 'ui_are_you_sure', - confirmActionText: 'ui_yes', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { diff --git a/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts b/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts index 0ef3812929a..649b0ad7d23 100644 --- a/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts +++ b/webapp/packages/plugin-settings-administration/src/SettingsAdministrationPluginBootstrap.ts @@ -38,8 +38,10 @@ export class SettingsAdministrationPluginBootstrap extends Bootstrap { if (edited) { const { status } = await this.commonDialogService.open(ConfirmationDialog, { - title: 'ui_save_reminder', - message: 'ui_are_you_sure', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { diff --git a/webapp/packages/plugin-user-profile-settings/src/UserProfileSettingsPluginBootstrap.ts b/webapp/packages/plugin-user-profile-settings/src/UserProfileSettingsPluginBootstrap.ts index 58248f6b4c9..08614f87b6e 100644 --- a/webapp/packages/plugin-user-profile-settings/src/UserProfileSettingsPluginBootstrap.ts +++ b/webapp/packages/plugin-user-profile-settings/src/UserProfileSettingsPluginBootstrap.ts @@ -38,8 +38,10 @@ export class UserProfileSettingsPluginBootstrap extends Bootstrap { } const { status } = await this.commonDialogService.open(ConfirmationDialog, { - title: 'ui_save_reminder', - message: 'ui_are_you_sure', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { From cc304635107acef861170a385022cfb305c9898f Mon Sep 17 00:00:00 2001 From: naumov Date: Mon, 27 Jul 2026 13:03:27 +0200 Subject: [PATCH 5/6] dbeaver/pro#4425 update notice --- .../src/Search/ConnectionSearchService.ts | 7 ++++--- .../PublicConnectionForm/PublicConnectionFormService.ts | 7 ++++--- webapp/packages/plugin-connections/src/locales/en.ts | 2 -- webapp/packages/plugin-connections/src/locales/fr.ts | 5 ----- webapp/packages/plugin-connections/src/locales/it.ts | 5 ----- webapp/packages/plugin-connections/src/locales/ru.ts | 2 -- webapp/packages/plugin-connections/src/locales/vi.ts | 2 -- webapp/packages/plugin-connections/src/locales/zh.ts | 2 -- 8 files changed, 8 insertions(+), 24 deletions(-) diff --git a/webapp/packages/plugin-connection-search/src/Search/ConnectionSearchService.ts b/webapp/packages/plugin-connection-search/src/Search/ConnectionSearchService.ts index 0dafe95dc44..8a1ec59a567 100644 --- a/webapp/packages/plugin-connection-search/src/Search/ConnectionSearchService.ts +++ b/webapp/packages/plugin-connection-search/src/Search/ConnectionSearchService.ts @@ -134,9 +134,10 @@ export class ConnectionSearchService { } const { status } = await this.commonDialogService.open(ConfirmationDialog, { - title: 'plugin_connections_connection_edit_cancel_title', - message: 'plugin_connections_connection_edit_cancel_message', - confirmActionText: 'ui_processing_ok', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); return status !== DialogueStateResult.Rejected; diff --git a/webapp/packages/plugin-connections/src/PublicConnectionForm/PublicConnectionFormService.ts b/webapp/packages/plugin-connections/src/PublicConnectionForm/PublicConnectionFormService.ts index c33684fa7be..80d3e0e6c80 100644 --- a/webapp/packages/plugin-connections/src/PublicConnectionForm/PublicConnectionFormService.ts +++ b/webapp/packages/plugin-connections/src/PublicConnectionForm/PublicConnectionFormService.ts @@ -183,9 +183,10 @@ export class PublicConnectionFormService { } const { status } = await this.commonDialogService.open(ConfirmationDialog, { - title: 'plugin_connections_connection_edit_cancel_title', - message: 'plugin_connections_connection_edit_cancel_message', - confirmActionText: 'ui_processing_ok', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); return status !== DialogueStateResult.Rejected; diff --git a/webapp/packages/plugin-connections/src/locales/en.ts b/webapp/packages/plugin-connections/src/locales/en.ts index 9dcfb4f4604..e23cdd1e5b5 100644 --- a/webapp/packages/plugin-connections/src/locales/en.ts +++ b/webapp/packages/plugin-connections/src/locales/en.ts @@ -13,8 +13,6 @@ export default [ ['plugin_connections_connection_edit_menu_item_title', 'Edit Connection'], ['plugin_connections_connection_clone', 'Clone'], ['plugin_connections_connection_clone_error', 'Failed to clone connection'], - ['plugin_connections_connection_edit_cancel_title', 'Cancel confirmation'], - ['plugin_connections_connection_edit_cancel_message', "You're going to cancel connection changes. Unsaved changes will be lost. Are you sure?"], ['plugin_connections_connection_edit_reconnect_title', 'Connection updated'], ['plugin_connections_connection_edit_reconnect_message', 'Connection has been updated. Do you want to reconnect?'], ['plugin_connections_connection_edit_reconnect_failed', 'Failed to reconnect'], diff --git a/webapp/packages/plugin-connections/src/locales/fr.ts b/webapp/packages/plugin-connections/src/locales/fr.ts index b43b3982f7e..5a0298d518b 100644 --- a/webapp/packages/plugin-connections/src/locales/fr.ts +++ b/webapp/packages/plugin-connections/src/locales/fr.ts @@ -11,11 +11,6 @@ export default [ ['plugin_connections_new_connection_dialog_title', 'Nouvelle connexion'], ['plugin_connections_connection_edit_menu_item_title', 'Modifier la connexion'], - ['plugin_connections_connection_edit_cancel_title', "Confirmation d'annulation"], - [ - 'plugin_connections_connection_edit_cancel_message', - 'Vous allez annuler les modifications de la connexion. Les modifications non enregistrées seront perdues. Êtes-vous sûr ?', - ], ['plugin_connections_connection_edit_reconnect_title', 'Connexion mise à jour'], ['plugin_connections_connection_edit_reconnect_message', 'La connexion a été mise à jour. Voulez-vous vous reconnecter ?'], ['plugin_connections_connection_edit_reconnect_failed', 'Échec de la reconnexion'], diff --git a/webapp/packages/plugin-connections/src/locales/it.ts b/webapp/packages/plugin-connections/src/locales/it.ts index a77f42d95bb..e25723d727e 100644 --- a/webapp/packages/plugin-connections/src/locales/it.ts +++ b/webapp/packages/plugin-connections/src/locales/it.ts @@ -13,11 +13,6 @@ export default [ ['plugin_connections_connection_edit_menu_item_title', 'Modifica Connessione'], ['plugin_connections_connection_clone', 'Clona'], ['plugin_connections_connection_clone_error', 'Impossibile clonare la connessione'], - ['plugin_connections_connection_edit_cancel_title', "Conferma l'annullamento"], - [ - 'plugin_connections_connection_edit_cancel_message', - 'Stai per annullare le modifiche alla connessione. Modifiche non salvate saranno perse. Sei sicuro?', - ], ['plugin_connections_connection_edit_reconnect_title', 'Connection updated'], ['plugin_connections_connection_edit_reconnect_message', 'Connection has been updated. Do you want to reconnect?'], ['plugin_connections_connection_edit_reconnect_failed', 'Failed to reconnect'], diff --git a/webapp/packages/plugin-connections/src/locales/ru.ts b/webapp/packages/plugin-connections/src/locales/ru.ts index 74f3ee7ae5c..93590c97595 100644 --- a/webapp/packages/plugin-connections/src/locales/ru.ts +++ b/webapp/packages/plugin-connections/src/locales/ru.ts @@ -13,8 +13,6 @@ export default [ ['plugin_connections_connection_edit_menu_item_title', 'Изменить подключение'], ['plugin_connections_connection_clone', 'Клонировать'], ['plugin_connections_connection_clone_error', 'Не удалось клонировать подключение'], - ['plugin_connections_connection_edit_cancel_title', 'Отмена редактирования'], - ['plugin_connections_connection_edit_cancel_message', 'Вы собираетесь закрыть редактор, несохраненные изменения не будут применены. Вы уверены?'], ['plugin_connections_connection_edit_reconnect_title', 'Подключение обновлено'], ['plugin_connections_connection_edit_reconnect_message', 'Подключение было обновлено. Вы хотите переподключиться?'], ['plugin_connections_connection_edit_reconnect_failed', 'Не удалось переподключиться'], diff --git a/webapp/packages/plugin-connections/src/locales/vi.ts b/webapp/packages/plugin-connections/src/locales/vi.ts index 98185ad0a98..c31eb4b79e4 100644 --- a/webapp/packages/plugin-connections/src/locales/vi.ts +++ b/webapp/packages/plugin-connections/src/locales/vi.ts @@ -13,8 +13,6 @@ export default [ ['plugin_connections_connection_edit_menu_item_title', 'Chỉnh sửa Kết nối'], ['plugin_connections_connection_clone', 'Sao chép'], ['plugin_connections_connection_clone_error', 'Không thể sao chép kết nối'], - ['plugin_connections_connection_edit_cancel_title', 'Xác nhận Hủy'], - ['plugin_connections_connection_edit_cancel_message', 'Bạn sắp hủy các thay đổi của kết nối. Các thay đổi chưa lưu sẽ bị mất. Bạn có chắc không?'], ['plugin_connections_connection_edit_reconnect_title', 'Kết nối đã được cập nhật'], ['plugin_connections_connection_edit_reconnect_message', 'Kết nối đã được cập nhật. Bạn có muốn kết nối lại không?'], ['plugin_connections_connection_edit_reconnect_failed', 'Không thể kết nối lại'], diff --git a/webapp/packages/plugin-connections/src/locales/zh.ts b/webapp/packages/plugin-connections/src/locales/zh.ts index 3f2413f4b56..a177e969c2e 100644 --- a/webapp/packages/plugin-connections/src/locales/zh.ts +++ b/webapp/packages/plugin-connections/src/locales/zh.ts @@ -13,8 +13,6 @@ export default [ ['plugin_connections_connection_edit_menu_item_title', '编辑连接'], ['plugin_connections_connection_clone', '克隆'], ['plugin_connections_connection_clone_error', '克隆连接失败'], - ['plugin_connections_connection_edit_cancel_title', '取消确认'], - ['plugin_connections_connection_edit_cancel_message', '您将取消连接更改。未保存的更改将丢失。您确定吗?'], ['plugin_connections_connection_edit_reconnect_title', '连接已更新'], ['plugin_connections_connection_edit_reconnect_message', '连接已更新。您想重新连接吗?'], ['plugin_connections_connection_edit_reconnect_failed', '重新连接失败'], From 231e704ef7408c5e82cc6793dd40e4b8ec1cc229 Mon Sep 17 00:00:00 2001 From: naumov Date: Mon, 27 Jul 2026 13:18:29 +0200 Subject: [PATCH 6/6] dbeaver/pro#4425 update tokens --- .../UserAuthenticationPart/ChangePassword.tsx | 7 ++++--- webapp/packages/plugin-user-profile/src/locales/en.ts | 5 ----- webapp/packages/plugin-user-profile/src/locales/fr.ts | 5 ----- webapp/packages/plugin-user-profile/src/locales/it.ts | 5 ----- webapp/packages/plugin-user-profile/src/locales/ru.ts | 5 ----- webapp/packages/plugin-user-profile/src/locales/vi.ts | 5 ----- webapp/packages/plugin-user-profile/src/locales/zh.ts | 5 ----- 7 files changed, 4 insertions(+), 33 deletions(-) diff --git a/webapp/packages/plugin-user-profile/src/UserProfileForm/UserAuthenticationPart/ChangePassword.tsx b/webapp/packages/plugin-user-profile/src/UserProfileForm/UserAuthenticationPart/ChangePassword.tsx index de2fa57b664..15a733c92ef 100644 --- a/webapp/packages/plugin-user-profile/src/UserProfileForm/UserAuthenticationPart/ChangePassword.tsx +++ b/webapp/packages/plugin-user-profile/src/UserProfileForm/UserAuthenticationPart/ChangePassword.tsx @@ -91,9 +91,10 @@ export const ChangePassword = observer(function ChangePassword() { if ((state.oldPassword || state.password || state.repeatedPassword) && !context.force) { const { status } = await commonDialogService.open(ConfirmationDialog, { - title: 'plugin_user_profile_authentication_change_password_cancel_title', - message: 'plugin_user_profile_authentication_change_password_cancel_message', - confirmActionText: 'ui_processing_ok', + title: 'ui_discard_changes', + message: 'ui_discard_changes_message', + confirmActionText: 'ui_discard', + cancelActionText: 'ui_keep_editing', }); if (status === DialogueStateResult.Rejected) { diff --git a/webapp/packages/plugin-user-profile/src/locales/en.ts b/webapp/packages/plugin-user-profile/src/locales/en.ts index 933f1766709..11c4b6918f6 100644 --- a/webapp/packages/plugin-user-profile/src/locales/en.ts +++ b/webapp/packages/plugin-user-profile/src/locales/en.ts @@ -17,9 +17,4 @@ export default [ ['plugin_user_profile_authentication_change_password_submit_label', 'Change'], ['plugin_user_profile_authentication_change_password_passwords_not_match', "Passwords don't match"], ['plugin_user_profile_authentication_change_password_password_validation_error', 'Password validation failed'], - ['plugin_user_profile_authentication_change_password_cancel_title', 'Cancel password change'], - [ - 'plugin_user_profile_authentication_change_password_cancel_message', - "You're going to cancel password changes. Unsaved changes will be lost. Are you sure?", - ], ]; diff --git a/webapp/packages/plugin-user-profile/src/locales/fr.ts b/webapp/packages/plugin-user-profile/src/locales/fr.ts index 50985990408..995bca2b893 100644 --- a/webapp/packages/plugin-user-profile/src/locales/fr.ts +++ b/webapp/packages/plugin-user-profile/src/locales/fr.ts @@ -17,9 +17,4 @@ export default [ ['plugin_user_profile_authentication_change_password_submit_label', 'Changer'], ['plugin_user_profile_authentication_change_password_passwords_not_match', 'Les mots de passe ne correspondent pas'], ['plugin_user_profile_authentication_change_password_validation_error', 'Échec de la validation du mot de passe'], - ['plugin_user_profile_authentication_change_password_cancel_title', 'Cancel password change'], - [ - 'plugin_user_profile_authentication_change_password_cancel_message', - "You're going to cancel password changes. Unsaved changes will be lost. Are you sure?", - ], ]; diff --git a/webapp/packages/plugin-user-profile/src/locales/it.ts b/webapp/packages/plugin-user-profile/src/locales/it.ts index 54754609a93..ae5f7017484 100644 --- a/webapp/packages/plugin-user-profile/src/locales/it.ts +++ b/webapp/packages/plugin-user-profile/src/locales/it.ts @@ -17,9 +17,4 @@ export default [ ['plugin_user_profile_authentication_change_password_submit_label', 'Modifica'], ['plugin_user_profile_authentication_change_password_passwords_not_match', 'Le Passwords non coincidono'], ['plugin_user_profile_authentication_change_password_password_validation_error', 'Password validation failed'], - ['plugin_user_profile_authentication_change_password_cancel_title', 'Cancel password change'], - [ - 'plugin_user_profile_authentication_change_password_cancel_message', - "You're going to cancel password changes. Unsaved changes will be lost. Are you sure?", - ], ]; diff --git a/webapp/packages/plugin-user-profile/src/locales/ru.ts b/webapp/packages/plugin-user-profile/src/locales/ru.ts index 0daccccdbbc..3fa4fd32286 100644 --- a/webapp/packages/plugin-user-profile/src/locales/ru.ts +++ b/webapp/packages/plugin-user-profile/src/locales/ru.ts @@ -17,9 +17,4 @@ export default [ ['plugin_user_profile_authentication_change_password_submit_label', 'Сменить'], ['plugin_user_profile_authentication_change_password_passwords_not_match', 'Пароли не совпадают'], ['plugin_user_profile_authentication_change_password_password_validation_error', 'Валидация пароля не удалась'], - ['plugin_user_profile_authentication_change_password_cancel_title', 'Отменить смену пароля'], - [ - 'plugin_user_profile_authentication_change_password_cancel_message', - 'Вы собираетесь отменить смену пароля. Несохраненные данные будут утеряны. Вы уверены?', - ], ]; diff --git a/webapp/packages/plugin-user-profile/src/locales/vi.ts b/webapp/packages/plugin-user-profile/src/locales/vi.ts index 7520db6967b..046cfd3cd4b 100644 --- a/webapp/packages/plugin-user-profile/src/locales/vi.ts +++ b/webapp/packages/plugin-user-profile/src/locales/vi.ts @@ -17,9 +17,4 @@ export default [ ['plugin_user_profile_authentication_change_password_submit_label', 'Đổi'], ['plugin_user_profile_authentication_change_password_passwords_not_match', 'Mật khẩu không khớp'], ['plugin_user_profile_authentication_change_password_password_validation_error', 'Xác thực mật khẩu thất bại'], - ['plugin_user_profile_authentication_change_password_cancel_title', 'Hủy đổi mật khẩu'], - [ - 'plugin_user_profile_authentication_change_password_cancel_message', - 'Bạn đang hủy thay đổi mật khẩu. Các thay đổi chưa lưu sẽ bị mất. Bạn có chắc chắn không?', - ], ]; diff --git a/webapp/packages/plugin-user-profile/src/locales/zh.ts b/webapp/packages/plugin-user-profile/src/locales/zh.ts index cecd2d25512..1bd2b9cc731 100644 --- a/webapp/packages/plugin-user-profile/src/locales/zh.ts +++ b/webapp/packages/plugin-user-profile/src/locales/zh.ts @@ -17,9 +17,4 @@ export default [ ['plugin_user_profile_authentication_change_password_submit_label', '更改'], ['plugin_user_profile_authentication_change_password_passwords_not_match', '密码不匹配'], ['plugin_user_profile_authentication_change_password_password_validation_error', '密码校验失败'], - ['plugin_user_profile_authentication_change_password_cancel_title', 'Cancel password change'], - [ - 'plugin_user_profile_authentication_change_password_cancel_message', - "You're going to cancel password changes. Unsaved changes will be lost. Are you sure?", - ], ];