diff --git a/packages/web/public/dimensions.css b/packages/web/public/dimensions.css
index 4eda591cd..bf227caf8 100644
--- a/packages/web/public/dimensions.css
+++ b/packages/web/public/dimensions.css
@@ -2,4 +2,6 @@
--dim-widget-icon-size: 50px;
--dim-statusbar-height: 20px;
--dim-left-panel-width: 300px;
+ --dim-tabs-panel-height: 53px;
+ --dim-splitter-thickness: 3px;
}
diff --git a/packages/web/src/Screen.svelte b/packages/web/src/Screen.svelte
index 7591e4df7..a72c27865 100644
--- a/packages/web/src/Screen.svelte
+++ b/packages/web/src/Screen.svelte
@@ -2,6 +2,7 @@
import WidgetContainer from './widgets/WidgetContainer.svelte';
import WidgetIconPanel from './widgets/WidgetIconPanel.svelte';
import { selectedWidget } from './stores';
+ import TabsPanel from './widgets/TabsPanel.svelte';
@@ -14,6 +15,9 @@
{/if}
+
+
+
diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte
new file mode 100644
index 000000000..cc27aa11d
--- /dev/null
+++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte
@@ -0,0 +1,40 @@
+
+
+
diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts
index 0ed1ae107..ff62e46c0 100644
--- a/packages/web/src/stores.ts
+++ b/packages/web/src/stores.ts
@@ -3,5 +3,6 @@ import { writable } from 'svelte/store';
export const selectedWidget = writable('database');
export const openedConnections = writable([]);
export const currentDatabase = writable(null);
+export const openedTabs = writable([]);
// export const leftPanelWidth = writable(300);
diff --git a/packages/web/src/utility/openNewTab.ts b/packages/web/src/utility/openNewTab.ts
new file mode 100644
index 000000000..6b9855a5c
--- /dev/null
+++ b/packages/web/src/utility/openNewTab.ts
@@ -0,0 +1,15 @@
+import uuidv1 from 'uuid/v1';
+import { openedTabs } from '../stores';
+
+export default async function openNewTab(newTab, initialData = undefined, options = undefined) {
+ console.log('OPENING NEW TAB', newTab);
+ const tabid = uuidv1();
+ openedTabs.update(tabs => [
+ ...(tabs || []).map(x => ({ ...x, selected: false })),
+ {
+ tabid,
+ selected: true,
+ ...newTab,
+ },
+ ]);
+}
diff --git a/packages/web/src/widgets/DatabaseWidget.svelte b/packages/web/src/widgets/DatabaseWidget.svelte
index 797628929..1ce47f105 100644
--- a/packages/web/src/widgets/DatabaseWidget.svelte
+++ b/packages/web/src/widgets/DatabaseWidget.svelte
@@ -1,5 +1,6 @@
Refresh
-CONNECTIONS
+
+ ({ ...x, conid, database }))} component={DatabaseObjectAppObject} />
+
diff --git a/packages/web/src/widgets/SqlObjectListWrapper.svelte b/packages/web/src/widgets/SqlObjectListWrapper.svelte
new file mode 100644
index 000000000..3cb62f611
--- /dev/null
+++ b/packages/web/src/widgets/SqlObjectListWrapper.svelte
@@ -0,0 +1,15 @@
+
+
+{#if conid && database}
+
+{:else}
+ Database not selected
+{/if}
diff --git a/packages/web/src/widgets/TabsPanel.svelte b/packages/web/src/widgets/TabsPanel.svelte
new file mode 100644
index 000000000..220a38233
--- /dev/null
+++ b/packages/web/src/widgets/TabsPanel.svelte
@@ -0,0 +1,123 @@
+
+
+
+
+{#each dbKeys as dbKey}
+
+
+
+ {tabsByDb[dbKey][0].tabDbName}
+
+
+ {#each _.sortBy(tabsByDb[dbKey], ['title', 'tabid']) as tab}
+
+
+
+ {tab.title}
+
+
+
+
+
+ {/each}
+
+
+{/each}
+
+