From d8405feab3b4c44636f482039f6013c35dcb28f8 Mon Sep 17 00:00:00 2001 From: Nybkox Date: Tue, 18 Mar 2025 20:54:17 +0100 Subject: [PATCH 01/76] feat: add jsonPreviewWrap option to settings --- packages/web/src/jsontree/JSONTree.svelte | 8 ++++++++ packages/web/src/settings/SettingsModal.svelte | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/packages/web/src/jsontree/JSONTree.svelte b/packages/web/src/jsontree/JSONTree.svelte index 13023326c..fddfda32e 100644 --- a/packages/web/src/jsontree/JSONTree.svelte +++ b/packages/web/src/jsontree/JSONTree.svelte @@ -6,6 +6,7 @@ import _ from 'lodash'; import { copyTextToClipboard } from '../utility/clipboard'; import { openJsonLinesData } from '../utility/openJsonLinesData'; + import { useSettings } from '../utility/metadataLoaders'; setContext('json-tree-context-key', {}); @@ -23,6 +24,9 @@ export let isInserted = false; export let isModified = false; + const settings = useSettings(); + $: wrap = $settings?.['behaviour.jsonPreviewWrap']; + setContext('json-tree-default-expanded', expandAll); if (slicedKeyCount) setContext('json-tree-sliced-key-count', slicedKeyCount); @@ -66,6 +70,7 @@ class:isDeleted class:isInserted class:isModified + class:wrap > + +
When you single-click or select a file in the "Tables, Views, Functions" view, it is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing From f8f855d5d2b1a741187a5dcb69de2c95f64b7ff5 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 25 Mar 2025 14:02:44 +0100 Subject: [PATCH 02/76] changed web --- packages/web/src/modals/AboutModal.svelte | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/web/src/modals/AboutModal.svelte b/packages/web/src/modals/AboutModal.svelte index a63ea8a04..5367aaee7 100644 --- a/packages/web/src/modals/AboutModal.svelte +++ b/packages/web/src/modals/AboutModal.svelte @@ -24,7 +24,7 @@ Build date: {moment(buildTime).format('YYYY-MM-DD')}
- Web: dbgate.org + Web: dbgate.io
Source codes: github @@ -32,9 +32,6 @@
Docker container: docker hub
-
- Online demo: demo.dbgate.org -
Search plugins: npmjs.com
From 2c5a7d103dace8419b096ec5d5cc7d5db522ba24 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 25 Mar 2025 15:10:59 +0100 Subject: [PATCH 03/76] premium info in community --- packages/web/src/icons/FontIcon.svelte | 2 + .../widgets/AdminPremiumPromoWidget.svelte | 79 +++++++++++++++++++ .../web/src/widgets/WidgetContainer.svelte | 4 + .../web/src/widgets/WidgetIconPanel.svelte | 26 +++++- 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 packages/web/src/widgets/AdminPremiumPromoWidget.svelte diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 74acfea14..0c00fd046 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -217,6 +217,8 @@ 'icon autocommit-on': 'mdi mdi-check-circle', 'icon autocommit-off': 'mdi mdi-check-circle-outline', + 'icon premium': 'mdi mdi-star', + 'img ok': 'mdi mdi-check-circle color-icon-green', 'img ok-inv': 'mdi mdi-check-circle color-icon-inv-green', 'img alert': 'mdi mdi-alert-circle color-icon-blue', diff --git a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte new file mode 100644 index 000000000..a26f494a6 --- /dev/null +++ b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte @@ -0,0 +1,79 @@ + + + +

Try DbGate Premium

+ +

Upgrade to get exclusive features:

+ +
    +
  • Query designer
  • +
  • Compare database models
  • +
  • Synchronize database structure
  • +
  • Backup & restore database
  • +
  • Export database model
  • +
  • AI assistant
  • +
  • libSQL, Turso, CosmosDB, Redshift support
  • +
  • Amazon and Azure identity providers
  • +
  • E-mail support
  • +
+ +

Download DbGate Premium

+
    +
  • Free 30 day trial
  • +
  • DbGate Premium will reuse your connections and files from DbGate Community
  • +
+ +
+ openWebLink('https://dbgate.io/download')} value="Download" /> +
+ +

Purchase DbGate Premium

+
    +
  • Use monthly or yearly subscription
  • +
+ +
+ openWebLink('https://dbgate.io/purchase/premium')} value="Purchase" /> +
+
+ + diff --git a/packages/web/src/widgets/WidgetContainer.svelte b/packages/web/src/widgets/WidgetContainer.svelte index 096c920c8..814a60c96 100644 --- a/packages/web/src/widgets/WidgetContainer.svelte +++ b/packages/web/src/widgets/WidgetContainer.svelte @@ -8,6 +8,7 @@ import HistoryWidget from './HistoryWidget.svelte'; import AppWidget from './AppWidget.svelte'; import AdminMenuWidget from './AdminMenuWidget.svelte'; + import AdminPremiumPromoWidget from './AdminPremiumPromoWidget.svelte';
{/if} - {#each widgets.filter(x => x && hasPermission(`widgets/${x.name}`)) as item} + {#each widgets + .filter(x => x && hasPermission(`widgets/${x.name}`)) + .filter(x => !x.isPremiumPromo || !isProApp()) as item}
handleChangeWidget(item.name)} > + {#if item.isPremiumPromo} +
Premium
+ {/if}
{/each} @@ -141,6 +153,7 @@ align-items: center; justify-content: center; color: var(--theme-font-inv-2); + position: relative; } .wrapper:hover { color: var(--theme-font-inv-1); @@ -154,4 +167,15 @@ flex: 1; flex-direction: column; } + + .premium-promo { + position: absolute; + text-transform: uppercase; + font-size: 6pt; + background: var(--theme-bg-inv-3); + color: var(--theme-font-inv-2); + padding: 1px 3px; + border-radius: 3px; + bottom: 0; + } From add73e6f1612d6104a4e824eda4482b4a75d28e1 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 25 Mar 2025 16:53:21 +0100 Subject: [PATCH 04/76] SYNC: filter - error --- e2e-tests/cypress/e2e/browse-data.cy.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index e9ccb870b..85a8db833 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -87,9 +87,10 @@ describe('Data browser data', () => { cy.contains('Album').click(); cy.testid('DataFilterControl_input_Title').type('Rock{enter}'); cy.contains('Rows: 7'); - cy.testid('DataFilterControl_input_AlbumId').type('>10{enter}'); - cy.contains('Rows: 5'); + cy.testid('DataFilterControl_input_AlbumId').type('>10xxx{enter}'); + cy.contains('Rows: 7'); cy.testid('DataFilterControl_filtermenu_Title').click(); + cy.testid('WidgetIconPanel_database').click(); cy.themeshot('filter'); cy.testid('DataGridCore_button_clearFilters').click(); cy.contains('Rows: 347'); From 78dbd7eacda961810447c4af0819a7c100264812 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 25 Mar 2025 17:12:28 +0100 Subject: [PATCH 05/76] SYNC: screenshot --- e2e-tests/cypress/e2e/browse-data.cy.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index 85a8db833..776d25356 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -90,7 +90,9 @@ describe('Data browser data', () => { cy.testid('DataFilterControl_input_AlbumId').type('>10xxx{enter}'); cy.contains('Rows: 7'); cy.testid('DataFilterControl_filtermenu_Title').click(); + // hide what is not needed cy.testid('WidgetIconPanel_database').click(); + cy.testid('DataGrid_itemReferences').click(); cy.themeshot('filter'); cy.testid('DataGridCore_button_clearFilters').click(); cy.contains('Rows: 347'); From 3004f4b5839baa3a15fc4dc0fa11b0634a0faa4a Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 08:00:18 +0100 Subject: [PATCH 06/76] malformed changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f20a1ad35..135788bb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,7 +29,7 @@ Builds: - FIXED: Scroll in XML cell view, XML view respect themes - REMOVED: armv7l build for Linux (because of problems with glibc compatibility) - CHANGED: Upgraded to node:22 for docker builds -- CHANGED: Upgraded SQLite engine version (better-sqlite3@11.8.1) +- CHANGED: Upgraded SQLite engine version ### 6.2.0 - ADDED: Query AI Assistant (Premium) From d53991276238ba63aceb5d14da73aa88b41a7e37 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 09:12:35 +0100 Subject: [PATCH 07/76] SYNC: fragment shots --- e2e-tests/cypress/e2e/add-connection.cy.js | 8 +++++++- packages/web/src/elements/TabControl.svelte | 3 ++- packages/web/src/tabs/ConnectionTab.svelte | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/e2e-tests/cypress/e2e/add-connection.cy.js b/e2e-tests/cypress/e2e/add-connection.cy.js index 3b71770fb..3bd67ec55 100644 --- a/e2e-tests/cypress/e2e/add-connection.cy.js +++ b/e2e-tests/cypress/e2e/add-connection.cy.js @@ -20,9 +20,15 @@ describe('Add connection', () => { cy.get('[data-testid=ConnectionDriverFields_displayName]').clear().type('test-mysql-1'); // test connection - cy.get('[data-testid=ConnectionTab_buttonTest]').click(); + cy.testid('ConnectionTab_buttonTest').click(); cy.contains('Connected:'); + cy.testid('ConnectionTab_tabSshTunnel').click(); + cy.testid('ConnectionTab_tabControlContent').themeshot('fragment-connection-sshtunnel', { padding: 50 }); + + cy.testid('ConnectionTab_tabSsl').click(); + cy.testid('ConnectionTab_tabControlContent').themeshot('fragment-connection-ssl', { padding: 50 }); + // save and connect cy.get('[data-testid=ConnectionTab_buttonSave]').click(); cy.get('[data-testid=ConnectionTab_buttonConnect]').click(); diff --git a/packages/web/src/elements/TabControl.svelte b/packages/web/src/elements/TabControl.svelte index d6abeafd3..4ca49ea36 100644 --- a/packages/web/src/elements/TabControl.svelte +++ b/packages/web/src/elements/TabControl.svelte @@ -16,6 +16,7 @@ export let isInline = false; export let containerMaxWidth = undefined; export let flex1 = true; + export let contentTestId = undefined; export function setValue(index) { value = index; @@ -39,7 +40,7 @@ {/if} -
+
{#each _.compact(tabs) as tab, index}
diff --git a/packages/web/src/tabs/ConnectionTab.svelte b/packages/web/src/tabs/ConnectionTab.svelte index 20604f363..d58e6f343 100644 --- a/packages/web/src/tabs/ConnectionTab.svelte +++ b/packages/web/src/tabs/ConnectionTab.svelte @@ -239,6 +239,7 @@ isInline containerMaxWidth="800px" flex1={false} + contentTestId="ConnectionTab_tabControlContent" tabs={[ { label: 'General', From e034fc10196db29eff4a219671df4fbe1b72b896 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 10:07:54 +0100 Subject: [PATCH 08/76] SYNC: new themeshot --- e2e-tests/cypress/e2e/browse-data.cy.js | 3 ++- packages/web/src/modals/ModalBase.svelte | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index 776d25356..fd1a21875 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -452,6 +452,7 @@ describe('Data browser data', () => { cy.testid('ExportDbModelModal_archiveFolder').select('(Create new)'); cy.testid('InputTextModal_value').clear().type('test-model'); cy.testid('InputTextModal_ok').click(); + cy.testid('ModalBase_window').themeshot('export-database-model-window', { padding: 50 }); cy.testid('ExportDbModelModal_exportButton').click(); cy.contains('Album').click(); cy.contains('autoIncrement'); @@ -465,7 +466,7 @@ describe('Data browser data', () => { cy.contains('chinook-archive').rightclick(); cy.contains('Data duplicator').click(); cy.contains('Dry run').click(); - cy.testid("DataDuplicatorTab_importIntoDb").click(); + cy.testid('DataDuplicatorTab_importIntoDb').click(); cy.contains('Duplicated Album, inserted 347 rows, mapped 0 rows, missing 0 rows, skipped 0 rows'); cy.themeshot('dataduplicator'); }); diff --git a/packages/web/src/modals/ModalBase.svelte b/packages/web/src/modals/ModalBase.svelte index 4730ce26d..1e41bdb74 100644 --- a/packages/web/src/modals/ModalBase.svelte +++ b/packages/web/src/modals/ModalBase.svelte @@ -39,7 +39,14 @@
-
+
{#if $$slots.header}
From 96f387e90bbcb089a0d360ad70162c47279d01aa Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 12:46:33 +0100 Subject: [PATCH 09/76] SEO friendly screenshot names --- e2e-tests/cypress/e2e/add-connection.cy.js | 6 +-- e2e-tests/cypress/e2e/browse-data.cy.js | 62 +++++++++++----------- e2e-tests/cypress/e2e/team.cy.js | 6 +-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/e2e-tests/cypress/e2e/add-connection.cy.js b/e2e-tests/cypress/e2e/add-connection.cy.js index 3bd67ec55..06b9916f1 100644 --- a/e2e-tests/cypress/e2e/add-connection.cy.js +++ b/e2e-tests/cypress/e2e/add-connection.cy.js @@ -13,7 +13,7 @@ describe('Add connection', () => { it('adds connection', () => { // cy.get('[data-testid=ConnectionList_buttonNewConnection]').click(); cy.get('[data-testid=ConnectionDriverFields_connectionType]').select('MySQL'); - cy.themeshot('connection'); + cy.themeshot('new-connection'); cy.get('[data-testid=ConnectionDriverFields_user]').clear().type('root'); cy.get('[data-testid=ConnectionDriverFields_password]').clear().type('Pwd2020Db'); cy.get('[data-testid=ConnectionDriverFields_port]').clear().type('16004'); @@ -24,10 +24,10 @@ describe('Add connection', () => { cy.contains('Connected:'); cy.testid('ConnectionTab_tabSshTunnel').click(); - cy.testid('ConnectionTab_tabControlContent').themeshot('fragment-connection-sshtunnel', { padding: 50 }); + cy.testid('ConnectionTab_tabControlContent').themeshot('connection-sshtunnel-window', { padding: 50 }); cy.testid('ConnectionTab_tabSsl').click(); - cy.testid('ConnectionTab_tabControlContent').themeshot('fragment-connection-ssl', { padding: 50 }); + cy.testid('ConnectionTab_tabControlContent').themeshot('connection-ssl-window', { padding: 50 }); // save and connect cy.get('[data-testid=ConnectionTab_buttonSave]').click(); diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index fd1a21875..fcc224d64 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -31,7 +31,7 @@ describe('Data browser data', () => { cy.contains('Finished job script'); cy.contains('Album.csv'); cy.testid('WidgetIconPanel_database').click(); - cy.themeshot('exportcsv'); + cy.themeshot('configure-export-csv'); }); it('Data archive editor - macros', () => { @@ -42,7 +42,7 @@ describe('Data browser data', () => { cy.contains('Out Of Exile').click({ shiftKey: true }); cy.contains('Change text case').click(); cy.contains('AUDIOSLAVE'); - cy.themeshot('freetable'); + cy.themeshot('data-archive-macros'); }); it('Load table data', () => { @@ -93,7 +93,7 @@ describe('Data browser data', () => { // hide what is not needed cy.testid('WidgetIconPanel_database').click(); cy.testid('DataGrid_itemReferences').click(); - cy.themeshot('filter'); + cy.themeshot('data-browser-filter'); cy.testid('DataGridCore_button_clearFilters').click(); cy.contains('Rows: 347'); }); @@ -117,16 +117,16 @@ describe('Data browser data', () => { cy.contains('PgChinook').click(); cy.contains('customer').click(); cy.contains('Leonie').click(); - cy.themeshot('datagrid'); + cy.themeshot('common-data-browser'); cy.contains('invoice').click(); cy.contains('invoice_line (invoice_id)').click(); - cy.themeshot('masterdetail'); + cy.themeshot('data-browser-master-detail'); cy.contains('9, Place Louis Barthou').click(); cy.contains('Switch to form').click(); cy.contains('Switch to table'); // test that we are in form view - cy.themeshot('formview'); + cy.themeshot('data-browser-form-view'); }); it('SQL Gen', () => { @@ -134,7 +134,7 @@ describe('Data browser data', () => { cy.contains('PgChinook').rightclick(); cy.contains('SQL Generator').click(); cy.contains('Check all').click(); - cy.themeshot('sqlgen'); + cy.themeshot('sql-generator'); }); it('Macros in DB', () => { @@ -149,7 +149,7 @@ describe('Data browser data', () => { cy.testid('DataGrid_itemMacros').click(); cy.contains('Change text case').click(); cy.contains('NIELSEN'); - cy.themeshot('macros'); + cy.themeshot('data-browser-macros'); }); it('Perspectives', () => { @@ -165,7 +165,7 @@ describe('Data browser data', () => { // check track is loaded cy.contains('Put The Finger On You'); - cy.themeshot('perspective1'); + cy.themeshot('perspective-designer'); }); it('Query editor - code completion', () => { @@ -179,7 +179,7 @@ describe('Data browser data', () => { cy.get('body').realType('select * from Album where Album.'); // code completion cy.contains('ArtistId'); - cy.themeshot('query'); + cy.themeshot('query-editor-code-completion'); }); it('Query editor - join wizard', () => { @@ -192,7 +192,7 @@ describe('Data browser data', () => { cy.get('body').realPress(['Control', 'j']); // JOIN wizard cy.contains('INNER JOIN Customer ON Invoice.CustomerId = Customer.CustomerId'); - cy.themeshot('joinwizard'); + cy.themeshot('query-editor-join-wizard'); }); it('Mongo JSON data view', () => { @@ -209,7 +209,7 @@ describe('Data browser data', () => { cy.testid('WidgetIconPanel_cell-data').click(); // test JSON view cy.contains('Country: "Brazil"'); - cy.themeshot('mongoquery'); + cy.themeshot('mongo-query-json-view'); }); it('SQL preview', () => { @@ -219,7 +219,7 @@ describe('Data browser data', () => { cy.contains('Show SQL').click(); // index should be part of create script cy.contains('CREATE INDEX `IFK_CustomerSupportRepId`'); - cy.themeshot('sqlpreview'); + cy.themeshot('sql-preview-create-index'); }); it('Query designer', () => { @@ -228,7 +228,7 @@ describe('Data browser data', () => { cy.testid('WidgetIconPanel_file').click(); cy.contains('customer').click(); // cy.contains('left join').rightclick(); - cy.themeshot('querydesigner'); + cy.themeshot('query-designer'); }); it('Database diagram', () => { @@ -239,7 +239,7 @@ describe('Data browser data', () => { cy.testid('WidgetIconPanel_file').click(); // check diagram is shown cy.contains('MediaTypeId'); - cy.themeshot('diagram'); + cy.themeshot('database-diagram'); }); it('Charts', () => { @@ -248,7 +248,7 @@ describe('Data browser data', () => { cy.contains('line-chart').click(); cy.testid('TabsPanel_buttonSplit').click(); cy.testid('WidgetIconPanel_file').click(); - cy.themeshot('charts'); + cy.themeshot('view-split-charts'); }); it('Keyboard configuration', () => { @@ -256,7 +256,7 @@ describe('Data browser data', () => { cy.contains('Keyboard shortcuts').click(); cy.contains('dataForm.refresh').click(); cy.testid('CommandModal_keyboardButton').click(); - cy.themeshot('keyboard'); + cy.themeshot('keyboard-configuration'); }); it('Command palette', () => { @@ -267,7 +267,7 @@ describe('Data browser data', () => { // cy.realPress('F1'); cy.realPress('PageDown'); cy.realPress('PageDown'); - cy.testid('CommandPalette_main').themeshot('commandpalette', { padding: 50 }); + cy.testid('CommandPalette_main').themeshot('command-palette', { padding: 50 }); }); it('Show map', () => { @@ -280,7 +280,7 @@ describe('Data browser data', () => { cy.contains('13.9').click({ shiftKey: true }); cy.testid('WidgetIconPanel_cell-data').click(); cy.wait(2000); - cy.themeshot('map'); + cy.themeshot('cell-map-view'); }); it('Search in connections', () => { @@ -292,7 +292,7 @@ describe('Data browser data', () => { cy.contains('Album').click(); cy.testid('SqlObjectList_searchMenuDropDown').click(); cy.contains('Column name').click(); - cy.themeshot('connsearch'); + cy.themeshot('search-in-connections'); }); it('Plugin tab', () => { @@ -302,7 +302,7 @@ describe('Data browser data', () => { cy.contains('Total white theme'); // wait for load logos cy.wait(2000); - cy.themeshot('plugin'); + cy.themeshot('view-plugin-tab'); }); it('Edit mongo data JSON', () => { @@ -329,7 +329,7 @@ describe('Data browser data', () => { cy.contains('Helena').rightclick(); cy.contains('Delete document').click(); cy.contains('Save').click(); - cy.themeshot('mongosave'); + cy.themeshot('save-changes-mongodb'); }); it('Edit mongo data JSON', () => { @@ -343,7 +343,7 @@ describe('Data browser data', () => { cy.testid('ColumnManagerRow_checkbox__id').click(); cy.testid('DataFilterControl_input_countries.1').type('EXISTS{enter}'); cy.testid('WidgetIconPanel_cell-data').click(); - cy.themeshot('collection'); + cy.themeshot('mongodb-json-cell-view'); }); it('Table structure editor', () => { @@ -355,7 +355,7 @@ describe('Data browser data', () => { cy.themeshot('structure'); cy.contains('EmployeeId').click(); cy.contains('Ref column - Employee'); - cy.themeshot('fkeditor'); + cy.themeshot('foreign-key-editor'); }); it('Compare database', () => { @@ -370,7 +370,7 @@ describe('Data browser data', () => { cy.themeshot('dbcompare'); cy.contains('Settings').click(); cy.testid('CompareModelTab_tabOperations').click(); - cy.themeshot('comparesettings'); + cy.themeshot('compare-database-settings'); }); it('Query editor - AI assistant', () => { @@ -385,7 +385,7 @@ describe('Data browser data', () => { cy.contains('Use this', { timeout: 10000 }).click(); cy.testid('QueryTab_executeButton').click(); cy.contains('Balls to the Wall'); - cy.themeshot('aiassistant'); + cy.themeshot('ai-assistant'); }); it('Modify data', () => { @@ -411,7 +411,7 @@ describe('Data browser data', () => { cy.contains('INSERT INTO `Employee`'); cy.contains("SET `FirstName`='Jane'"); cy.contains('DELETE FROM `Employee`'); - cy.themeshot('modifydata'); + cy.themeshot('data-browser-save-changes'); // cy.testid('ConfirmSqlModal_okButton').click(); // cy.contains('Cannot delete or update a parent row') @@ -434,7 +434,7 @@ describe('Data browser data', () => { cy.testid('DataFilterControl_input_ArtistId').type('22{enter}'); // cy.contains('Presence').rightclick(); cy.contains('Export').click(); - cy.themeshot('simpleexport'); + cy.themeshot('data-browser-export-menu'); }); it('MySQL native backup', () => { @@ -442,7 +442,7 @@ describe('Data browser data', () => { cy.contains('MyChinook').rightclick(); cy.contains('Create database backup').click(); cy.contains('Customer'); - cy.themeshot('mysqlbackup'); + cy.themeshot('mysql-backup-configuration'); }); it('View table YAML model', () => { @@ -456,7 +456,7 @@ describe('Data browser data', () => { cy.testid('ExportDbModelModal_exportButton').click(); cy.contains('Album').click(); cy.contains('autoIncrement'); - cy.themeshot('tableyaml'); + cy.themeshot('database-model-table-yaml'); }); it('Data duplicator', () => { @@ -468,6 +468,6 @@ describe('Data browser data', () => { cy.contains('Dry run').click(); cy.testid('DataDuplicatorTab_importIntoDb').click(); cy.contains('Duplicated Album, inserted 347 rows, mapped 0 rows, missing 0 rows, skipped 0 rows'); - cy.themeshot('dataduplicator'); + cy.themeshot('data-duplicator'); }); }); diff --git a/e2e-tests/cypress/e2e/team.cy.js b/e2e-tests/cypress/e2e/team.cy.js index a1f03a2d4..d63ed0332 100644 --- a/e2e-tests/cypress/e2e/team.cy.js +++ b/e2e-tests/cypress/e2e/team.cy.js @@ -14,18 +14,18 @@ describe('Team edition tests', () => { cy.contains('New connection').click(); cy.contains('New connection').click(); cy.testid('ConnectionDriverFields_connectionType').select('PostgreSQL'); - cy.themeshot('connadmin'); + cy.themeshot('connection-administration'); cy.testid('AdminMenuWidget_itemRoles').click(); cy.contains('Permissions').click(); - cy.themeshot('roleadmin'); + cy.themeshot('role-administration'); cy.testid('AdminMenuWidget_itemAuthentication').click(); cy.contains('Add authentication').click(); cy.contains('Use database login').click(); cy.contains('Add authentication').click(); cy.contains('OAuth 2.0').click(); - cy.themeshot('authadmin'); + cy.themeshot('authentication-administration'); }); it('OAuth authentication', () => { From 0a1972b854ea03d68a7cc46f38bffd86bc5adbd1 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 12:59:08 +0100 Subject: [PATCH 10/76] themeshot name --- e2e-tests/cypress/e2e/browse-data.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index fcc224d64..a92670309 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -352,7 +352,7 @@ describe('Data browser data', () => { cy.contains('Customer').rightclick(); cy.contains('Open structure').click(); cy.contains('varchar(40)'); - cy.themeshot('structure'); + cy.themeshot('table-structure-editor'); cy.contains('EmployeeId').click(); cy.contains('Ref column - Employee'); cy.themeshot('foreign-key-editor'); From c1da8321ac00e2420842e0cd588e4626d03d4cfd Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 13:09:11 +0100 Subject: [PATCH 11/76] themeshot name --- e2e-tests/cypress/e2e/browse-data.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index a92670309..9a24e88eb 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -367,7 +367,7 @@ describe('Data browser data', () => { cy.testid('CompareModelTab_gridObjects_Customer_Customer').click(); cy.testid('WidgetIconPanel_database').click(); cy.testid('CompareModelTab_tabDdl').click(); - cy.themeshot('dbcompare'); + cy.themeshot('compare-database-models'); cy.contains('Settings').click(); cy.testid('CompareModelTab_tabOperations').click(); cy.themeshot('compare-database-settings'); From bd571dc93d40be2afd730196da446ded3e050e0a Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 26 Mar 2025 16:13:01 +0100 Subject: [PATCH 12/76] SYNC: slightly better dropdownmanu-layout algorithm --- e2e-tests/cypress/e2e/browse-data.cy.js | 3 + e2e-tests/screenshots/dummy.txt | 1 - .../buttons/ToolStripDropDownButton.svelte | 5 +- .../web/src/modals/CurrentDropDownMenu.svelte | 1 + packages/web/src/modals/DropDownMenu.svelte | 79 +++++++++++-------- 5 files changed, 54 insertions(+), 35 deletions(-) delete mode 100644 e2e-tests/screenshots/dummy.txt diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index 9a24e88eb..8bcacec7d 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -433,7 +433,10 @@ describe('Data browser data', () => { cy.contains('Album').click(); cy.testid('DataFilterControl_input_ArtistId').type('22{enter}'); // cy.contains('Presence').rightclick(); + // cy.contains('Coda').rightclick(); + // cy.testid('DropDownMenu-container-0').contains('Export').click(); cy.contains('Export').click(); + // cy.wait(1000); cy.themeshot('data-browser-export-menu'); }); diff --git a/e2e-tests/screenshots/dummy.txt b/e2e-tests/screenshots/dummy.txt deleted file mode 100644 index 59633d601..000000000 --- a/e2e-tests/screenshots/dummy.txt +++ /dev/null @@ -1 +0,0 @@ -Folder with screenshots \ No newline at end of file diff --git a/packages/web/src/buttons/ToolStripDropDownButton.svelte b/packages/web/src/buttons/ToolStripDropDownButton.svelte index 5a06ab9ab..b84536163 100644 --- a/packages/web/src/buttons/ToolStripDropDownButton.svelte +++ b/packages/web/src/buttons/ToolStripDropDownButton.svelte @@ -14,8 +14,9 @@ function handleClick(e) { const rect = e.detail.target.getBoundingClientRect(); const left = rect.left; - const top = rect.bottom; - currentDropDownMenu.set({ left, top, items: menu }); + const top = rect.top; + // const top = rect.bottom; + currentDropDownMenu.set({ left, bottom: window.innerHeight - top, items: menu }); } diff --git a/packages/web/src/modals/CurrentDropDownMenu.svelte b/packages/web/src/modals/CurrentDropDownMenu.svelte index 320285ca7..327045e93 100644 --- a/packages/web/src/modals/CurrentDropDownMenu.svelte +++ b/packages/web/src/modals/CurrentDropDownMenu.svelte @@ -8,6 +8,7 @@ ($currentDropDownMenu = null)} diff --git a/packages/web/src/modals/DropDownMenu.svelte b/packages/web/src/modals/DropDownMenu.svelte index f5ac0c323..05f7ddcf4 100644 --- a/packages/web/src/modals/DropDownMenu.svelte +++ b/packages/web/src/modals/DropDownMenu.svelte @@ -7,29 +7,6 @@ if (side == 'right') return { top: top, left: left + box.width }; return { top: top, left: left }; } - - function fixPopupPlacement(element) { - const { width, height } = element.getBoundingClientRect(); - let offset = getElementOffset(element); - - let newLeft = null; - let newTop = null; - - if (offset.left + width > window.innerWidth) { - newLeft = offset.left - width; - - if (newLeft < 0) newLeft = 0; - } - - if (offset.top + height > window.innerHeight) { - newTop = offset.top - height; - - if (newTop < 0) newTop = 0; - } - - if (newLeft != null) element.style.left = `${newLeft}px`; - if (newTop != null) element.style.top = `${newTop}px`; - } -
- {#if tables?.length > 0} + {#if showColumnFilter && tables?.length > 0}