diff --git a/packages/web/src/buttons/CtaButton.svelte b/packages/web/src/buttons/CtaButton.svelte new file mode 100644 index 000000000..2b77f7ca8 --- /dev/null +++ b/packages/web/src/buttons/CtaButton.svelte @@ -0,0 +1,46 @@ + + + + + diff --git a/packages/web/src/jsontree/JSONArrayNode.svelte b/packages/web/src/jsontree/JSONArrayNode.svelte index 1f57ac377..205ff32f8 100644 --- a/packages/web/src/jsontree/JSONArrayNode.svelte +++ b/packages/web/src/jsontree/JSONArrayNode.svelte @@ -3,6 +3,8 @@ export let key, value, isParentExpanded, isParentArray; export let expanded = false; + export let labelOverride = null; + export let hideKey = false; const filteredKey = new Set(['length']); $: keys = Object.getOwnPropertyNames(value); @@ -22,8 +24,10 @@ {keys} {previewKeys} {getValue} - label="Array({value.length})" + label={labelOverride || `Array(${value.length})`} bracketOpen="[" bracketClose="]" elementValue={value} -/> \ No newline at end of file + {labelOverride} + {hideKey} +/> diff --git a/packages/web/src/jsontree/JSONIterableArrayNode.svelte b/packages/web/src/jsontree/JSONIterableArrayNode.svelte index 927455bce..75bc356ea 100644 --- a/packages/web/src/jsontree/JSONIterableArrayNode.svelte +++ b/packages/web/src/jsontree/JSONIterableArrayNode.svelte @@ -2,6 +2,8 @@ import JSONNested from './JSONNested.svelte'; export let key, value, isParentExpanded, isParentArray, nodeType; + export let labelOverride = null; + export let hideKey = false; let keys = []; @@ -29,7 +31,9 @@ {getKey} {getValue} isArray={true} - label="{nodeType}({keys.length})" + label={labelOverride || `${nodeType}(${keys.length})`} bracketOpen={'{'} bracketClose={'}'} -/> \ No newline at end of file + {labelOverride} + {hideKey} +/> diff --git a/packages/web/src/jsontree/JSONIterableMapNode.svelte b/packages/web/src/jsontree/JSONIterableMapNode.svelte index 907ee0326..8c0aad697 100644 --- a/packages/web/src/jsontree/JSONIterableMapNode.svelte +++ b/packages/web/src/jsontree/JSONIterableMapNode.svelte @@ -3,6 +3,8 @@ import MapEntry from './utils/MapEntry' export let key, value, isParentExpanded, isParentArray, nodeType; + export let labelOverride = null; + export let hideKey = false; let keys = []; @@ -28,8 +30,10 @@ {keys} {getKey} {getValue} - label="{nodeType}({keys.length})" + label={labelOverride || `${nodeType}(${keys.length})`} colon="" bracketOpen={'{'} bracketClose={'}'} + {labelOverride} + {hideKey} /> diff --git a/packages/web/src/jsontree/JSONMapEntryNode.svelte b/packages/web/src/jsontree/JSONMapEntryNode.svelte index cccd283fa..1f012e10b 100644 --- a/packages/web/src/jsontree/JSONMapEntryNode.svelte +++ b/packages/web/src/jsontree/JSONMapEntryNode.svelte @@ -3,6 +3,8 @@ export let key, value, isParentExpanded, isParentArray; export let expanded = false; + export let hideKey = false; + export let labelOverride = null; const keys = ['key', 'value']; @@ -17,7 +19,9 @@ key={isParentExpanded ? String(key) : value.key} {keys} {getValue} - label={isParentExpanded ? 'Entry ' : '=> '} + label={labelOverride || (isParentExpanded ? 'Entry ' : '=> ')} bracketOpen={'{'} bracketClose={'}'} -/> \ No newline at end of file + {labelOverride} + {hideKey} +/> diff --git a/packages/web/src/jsontree/JSONNested.svelte b/packages/web/src/jsontree/JSONNested.svelte index 2c0a71bec..0efa828ac 100644 --- a/packages/web/src/jsontree/JSONNested.svelte +++ b/packages/web/src/jsontree/JSONNested.svelte @@ -21,11 +21,14 @@ expandable = true; export let elementValue = null; export let onRootExpandedChanged = null; + export let labelOverride = null; + export let hideKey = false; const context = getContext('json-tree-context-key'); setContext('json-tree-context-key', { ...context, colon }); const elementData = getContext('json-tree-element-data'); const slicedKeyCount = getContext('json-tree-sliced-key-count'); + const keyLabel = labelOverride ?? key; $: slicedKeys = expanded ? keys : previewKeys.slice(0, slicedKeyCount || 5); @@ -56,7 +59,16 @@ {#if expandable && isParentExpanded} {/if} - + {#if !hideKey} + + {/if} {label}{bracketOpen} {#if isParentExpanded} diff --git a/packages/web/src/jsontree/JSONNode.svelte b/packages/web/src/jsontree/JSONNode.svelte index bf526e1ca..a7b179c16 100644 --- a/packages/web/src/jsontree/JSONNode.svelte +++ b/packages/web/src/jsontree/JSONNode.svelte @@ -16,6 +16,7 @@ export let expanded = !!getContext('json-tree-default-expanded'); export let labelOverride = null; export let onRootExpandedChanged = null; + export let hideKey = false; $: nodeType = objType(value); $: componentType = getComponent(nodeType); @@ -85,4 +86,5 @@ {expanded} {labelOverride} {onRootExpandedChanged} + {hideKey} /> diff --git a/packages/web/src/jsontree/JSONObjectNode.svelte b/packages/web/src/jsontree/JSONObjectNode.svelte index 71f0dd536..33320a8ff 100644 --- a/packages/web/src/jsontree/JSONObjectNode.svelte +++ b/packages/web/src/jsontree/JSONObjectNode.svelte @@ -5,6 +5,7 @@ export let expanded = false; export let labelOverride = null; export let onRootExpandedChanged = null; + export let hideKey = false; $: keys = Object.getOwnPropertyNames(value); @@ -26,4 +27,5 @@ bracketClose={'}'} elementValue={value} {onRootExpandedChanged} + {hideKey} /> diff --git a/packages/web/src/jsontree/JSONTree.svelte b/packages/web/src/jsontree/JSONTree.svelte index fddfda32e..311e54c6b 100644 --- a/packages/web/src/jsontree/JSONTree.svelte +++ b/packages/web/src/jsontree/JSONTree.svelte @@ -2,7 +2,6 @@ import JSONNode from './JSONNode.svelte'; import { setContext } from 'svelte'; import contextMenu, { getContextMenu } from '../utility/contextMenu'; - import openNewTab from '../utility/openNewTab'; import _ from 'lodash'; import { copyTextToClipboard } from '../utility/clipboard'; import { openJsonLinesData } from '../utility/openJsonLinesData'; @@ -23,6 +22,7 @@ export let isDeleted = false; export let isInserted = false; export let isModified = false; + export let hideKey = false; const settings = useSettings(); $: wrap = $settings?.['behaviour.jsonPreviewWrap']; @@ -73,6 +73,7 @@ class:wrap > + +
  • + + + {valueGetter ? valueGetter(value) : value} + +
  • + -
  • - - - {valueGetter ? valueGetter(value) : value} - -
  • \ No newline at end of file + diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index badfa1ce7..34188e2cc 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -215,6 +215,8 @@ export const connectionAppObjectSearchSettings = writableWithStorage( 'connectionAppObjectSearchSettings2' ); +export const serverSummarySelectedTab = writableWithStorage(0, 'serverSummary.selectedTab'); + let currentThemeValue = null; currentTheme.subscribe(value => { currentThemeValue = value; diff --git a/packages/web/src/tabs/ServerSummaryTab.svelte b/packages/web/src/tabs/ServerSummaryTab.svelte index 0686a5edc..3043ac358 100644 --- a/packages/web/src/tabs/ServerSummaryTab.svelte +++ b/packages/web/src/tabs/ServerSummaryTab.svelte @@ -18,15 +18,17 @@ import ToolStripCommandButton from '../buttons/ToolStripCommandButton.svelte'; import ToolStripContainer from '../buttons/ToolStripContainer.svelte'; import registerCommand from '../commands/registerCommand'; - import Link from '../elements/Link.svelte'; import LoadingInfo from '../elements/LoadingInfo.svelte'; + import TabControl from '../elements/TabControl.svelte'; - import ObjectListControl from '../elements/ObjectListControl.svelte'; import { _t } from '../translations'; import { apiCall } from '../utility/api'; import createActivator, { getActiveComponent } from '../utility/createActivator'; - import formatFileSize from '../utility/formatFileSize'; import openNewTab from '../utility/openNewTab'; + import SummaryVariables from '../widgets/SummaryVariables.svelte'; + import SummaryProcesses from '../widgets/SummaryProcesses.svelte'; + import SummaryDatabases from '../widgets/SummaryDatabases.svelte'; + import { serverSummarySelectedTab } from '../stores'; export let conid; @@ -78,26 +80,31 @@ {:then summary}
    - ({ - ...col, - slot: col.columnType == 'bytes' ? 1 : col.columnType == 'actions' ? 2 : null, - }))} - > - {formatFileSize(row?.[col.fieldName])} - - {#each col.actions as action, index} - {#if index > 0} - | - {/if} - runAction(action, row)}>{action.header} - {/each} - - + serverSummarySelectedTab.set(index)} + tabs={[ + { + label: 'Variables', + component: SummaryVariables, + props: { variables: summary.variables || [] }, + }, + { + label: 'Processes', + component: SummaryProcesses, + props: { processes: summary.processes || [], conid }, + }, + { + label: 'Databases', + component: SummaryDatabases, + props: { databases: summary.databases || [] }, + }, + ]} + />
    {/await} diff --git a/packages/web/src/tabs/TableStructureTab.svelte b/packages/web/src/tabs/TableStructureTab.svelte index 1e8ab9efb..f5dfca571 100644 --- a/packages/web/src/tabs/TableStructureTab.svelte +++ b/packages/web/src/tabs/TableStructureTab.svelte @@ -197,7 +197,7 @@ defaultActionId: 'openTable', }, }); - }}>DataDataX + import TableControl from '../elements/TableControl.svelte'; + import CtaButton from '../buttons/CtaButton.svelte'; + import { _t } from '../translations'; + import formatFileSize from '../utility/formatFileSize'; + + export let databases: any[] = []; + + async function profileOff(database: any) { + // TODO: Implement profile off functionality + console.log('Profile off:', database.name); + } + + async function profileFiltered(database: any) { + // TODO: Implement profile filtered functionality + console.log('Profile filtered:', database.name); + } + + async function profileAll(database: any) { + // TODO: Implement profile all functionality + console.log('Profile all:', database.name); + } + + +
    + + + profileOff(row)}>Profile Off + | + profileFiltered(row)}>Profile Filtered + | + profileAll(row)}>Profile All + + + + {row.name} + + + + {formatFileSize(row.sizeOnDisk)} + + + + {formatFileSize(row.dataSize)} + + + + {formatFileSize(row.indexSize)} + + +
    + + diff --git a/packages/web/src/widgets/SummaryProcesses.svelte b/packages/web/src/widgets/SummaryProcesses.svelte new file mode 100644 index 000000000..c9e765bd3 --- /dev/null +++ b/packages/web/src/widgets/SummaryProcesses.svelte @@ -0,0 +1,77 @@ + + +
    + + + killProcess(row.processId)}> + {_t('common.kill', { defaultMessage: 'Kill' })} + + + + + {row.processId} + + + + {formatRunningTime(row.runningTime)} + + + + {row.waitingFor ? 'Yes' : 'No'} + + +
    + + diff --git a/packages/web/src/widgets/SummaryVariables.svelte b/packages/web/src/widgets/SummaryVariables.svelte new file mode 100644 index 000000000..7a37b6a34 --- /dev/null +++ b/packages/web/src/widgets/SummaryVariables.svelte @@ -0,0 +1,29 @@ + + +
    + + + + + +
    + +