diff --git a/packages/web/src/appobj/ColumnAppObject.svelte b/packages/web/src/appobj/ColumnAppObject.svelte
index 4ee66bc29..8598414e0 100644
--- a/packages/web/src/appobj/ColumnAppObject.svelte
+++ b/packages/web/src/appobj/ColumnAppObject.svelte
@@ -3,7 +3,7 @@
+
+
+
+ {constraintName}
+
diff --git a/packages/web/src/elements/ForeignKeyObjectListControl.svelte b/packages/web/src/elements/ForeignKeyObjectListControl.svelte
new file mode 100644
index 000000000..4ca6a70ce
--- /dev/null
+++ b/packages/web/src/elements/ForeignKeyObjectListControl.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+ {row?.columns.map(x => x.columnName).join(', ')}
+ {row?.columns.map(x => x.refColumnName).join(', ')}
+
diff --git a/packages/web/src/elements/ObjectListControl.svelte b/packages/web/src/elements/ObjectListControl.svelte
new file mode 100644
index 000000000..f6fbe692e
--- /dev/null
+++ b/packages/web/src/elements/ObjectListControl.svelte
@@ -0,0 +1,78 @@
+
+
+{#if collection?.length > 0 || showIfEmpty}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{/if}
diff --git a/packages/web/src/elements/TableControl.svelte b/packages/web/src/elements/TableControl.svelte
index 658c8134b..f46e3f919 100644
--- a/packages/web/src/elements/TableControl.svelte
+++ b/packages/web/src/elements/TableControl.svelte
@@ -1,10 +1,5 @@
-
- export let columns: TableColumn[];
+
+
+
+
+
+ ({ ...x, ordinal: index + 1 }))}
+ title="Columns"
+ columns={[
+ {
+ fieldName: 'notNull',
+ header: 'Not NULL',
+ sortable: true,
+ slot: 0,
+ },
+ {
+ fieldName: 'dataType',
+ header: 'Data Type',
+ sortable: true,
+ },
+ {
+ fieldName: 'defaultValue',
+ header: 'Default value',
+ sortable: true,
+ },
+ {
+ fieldName: 'isSparse',
+ header: 'Is Sparse',
+ sortable: true,
+ slot: 1,
+ },
+ {
+ fieldName: 'computedExpression',
+ header: 'Computed Expression',
+ sortable: true,
+ },
+ {
+ fieldName: 'isPersisted',
+ header: 'Is Persisted',
+ sortable: true,
+ slot: 2,
+ },
+ ]}
+ >
+ {row?.notNull ? 'YES' : 'NO'}
+ {row?.isSparse ? 'YES' : 'NO'}
+ {row?.isPersisted ? 'YES' : 'NO'}
+
+
+
+
+
+ {row?.columns.map(x => x.columnName).join(', ')}
+
+
+
+
+
+
+
diff --git a/packages/web/src/tabs/index.js b/packages/web/src/tabs/index.js
index 1b85db00e..46cc527b0 100644
--- a/packages/web/src/tabs/index.js
+++ b/packages/web/src/tabs/index.js
@@ -1,6 +1,6 @@
import * as TableDataTab from './TableDataTab.svelte';
import * as ViewDataTab from './ViewDataTab.svelte';
-// import TableStructureTab from './TableStructureTab';
+import * as TableStructureTab from './TableStructureTab.svelte';
import * as QueryTab from './QueryTab.svelte';
import * as ShellTab from './ShellTab.svelte';
// import InfoPageTab from './InfoPageTab';
@@ -17,7 +17,7 @@ import * as MarkdownEditorTab from './MarkdownEditorTab.svelte';
export default {
TableDataTab,
ViewDataTab,
- // TableStructureTab,
+ TableStructureTab,
QueryTab,
// InfoPageTab,
ShellTab,