diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 826df60ba..c3464707a 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -115,7 +115,7 @@ registerCommand({ registerCommand({ id: 'new.table', category: 'New', - icon: 'img table', + icon: 'icon table', name: 'Table', toolbar: true, toolbarName: 'New table', @@ -147,6 +147,41 @@ registerCommand({ }, }); +registerCommand({ + id: 'new.collection', + category: 'New', + icon: 'icon table', + name: 'Collection', + toolbar: true, + toolbarName: 'New collection', + testEnabled: () => { + const driver = findEngineDriver(get(currentDatabase)?.connection, getExtensions()); + return !!get(currentDatabase) && driver?.dialect?.nosql; + }, + onClick: async () => { + const $currentDatabase = get(currentDatabase); + const connection = _.get($currentDatabase, 'connection') || {}; + const database = _.get($currentDatabase, 'name'); + + const dbid = { conid: connection._id, database }; + + showModal(InputTextModal, { + value: '', + label: 'New collection name', + header: 'Create collection', + onConfirm: async newCollection => { + await axiosInstance.request({ + url: 'database-connections/run-script', + method: 'post', + params: dbid, + data: { sql: `db.createCollection('${newCollection}')` }, + }); + axiosInstance.post('database-connections/sync-model', dbid); + }, + }); + }, +}); + registerCommand({ id: 'new.markdown', category: 'New', diff --git a/packages/web/src/elements/CloseSearchButton.svelte b/packages/web/src/elements/CloseSearchButton.svelte new file mode 100644 index 000000000..f3d5a7178 --- /dev/null +++ b/packages/web/src/elements/CloseSearchButton.svelte @@ -0,0 +1,13 @@ + + +{#if filter} + (filter = '')} title="Clear filter"> + + +{/if} diff --git a/packages/web/src/elements/InlineButton.svelte b/packages/web/src/elements/InlineButton.svelte index a3579d8da..14b79a412 100644 --- a/packages/web/src/elements/InlineButton.svelte +++ b/packages/web/src/elements/InlineButton.svelte @@ -2,6 +2,7 @@ export let disabled = false; export let square = false; export let narrow = false; + export let title = null; let domButton; @@ -10,7 +11,7 @@ } -
+
diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 5953ff8ee..7cc6eddda 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -38,6 +38,7 @@ 'icon filter': 'mdi mdi-filter', 'icon filter-off': 'mdi mdi-filter-off', 'icon reload': 'mdi mdi-reload', + 'icon refresh': 'mdi mdi-refresh', 'icon undo': 'mdi mdi-undo', 'icon redo': 'mdi mdi-redo', 'icon save': 'mdi mdi-content-save', @@ -78,6 +79,7 @@ 'icon checkbox-marked': 'mdi mdi-checkbox-marked-outline', 'icon dots-horizontal': 'mdi mdi-dots-horizontal', 'icon dots-vertical': 'mdi mdi-dots-vertical', + 'icon add': 'mdi mdi-plus-circle', 'icon run': 'mdi mdi-play', 'icon chevron-down': 'mdi mdi-chevron-down', diff --git a/packages/web/src/widgets/ConnectionList.svelte b/packages/web/src/widgets/ConnectionList.svelte index 940dad69e..3ac54230e 100644 --- a/packages/web/src/widgets/ConnectionList.svelte +++ b/packages/web/src/widgets/ConnectionList.svelte @@ -14,6 +14,8 @@ import runCommand from '../commands/runCommand'; import getConnectionLabel from '../utility/getConnectionLabel'; import { useConnectionColorFactory } from '../utility/useConnectionColor'; + import FontIcon from '../icons/FontIcon.svelte'; + import CloseSearchButton from '../elements/CloseSearchButton.svelte'; const connections = useConnectionList(); const serverStatus = useServerStatus(); @@ -36,7 +38,13 @@ - Refresh + + runCommand('new.connection')} title="Add new connection"> + + + + + { axiosInstance.post('database-connections/refresh', { conid, database }); }; + + function createAddMenu() { + if (driver?.dialect?.nosql) { + return [{ label: 'New collection', command: 'new.collection' }]; + } else { + return [{ label: 'New table', command: 'new.table' }]; + } + } {#if $status && $status.name == 'error'} @@ -72,7 +88,11 @@ {:else} - Refresh + + + + + {#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects}