mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-26 05:15:59 +00:00
subcolumns in designer
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
import ColumnLabel from '../elements/ColumnLabel.svelte';
|
import ColumnLabel from '../elements/ColumnLabel.svelte';
|
||||||
|
|
||||||
import CheckboxField from '../forms/CheckboxField.svelte';
|
import CheckboxField from '../forms/CheckboxField.svelte';
|
||||||
|
import { plusExpandIcon } from '../icons/expandIcons';
|
||||||
import FontIcon from '../icons/FontIcon.svelte';
|
import FontIcon from '../icons/FontIcon.svelte';
|
||||||
import contextMenu from '../utility/contextMenu';
|
import contextMenu from '../utility/contextMenu';
|
||||||
import SortOrderIcon from './SortOrderIcon.svelte';
|
import SortOrderIcon from './SortOrderIcon.svelte';
|
||||||
@@ -21,6 +22,11 @@
|
|||||||
export let onAddReferenceByColumn;
|
export let onAddReferenceByColumn;
|
||||||
export let onSelectColumn;
|
export let onSelectColumn;
|
||||||
export let settings;
|
export let settings;
|
||||||
|
export let nestingSupported = null;
|
||||||
|
export let isExpandable = false;
|
||||||
|
export let isExpanded = false;
|
||||||
|
export let expandLevel = 0;
|
||||||
|
export let toggleExpanded = null;
|
||||||
|
|
||||||
$: designerColumn = (designer.columns || []).find(
|
$: designerColumn = (designer.columns || []).find(
|
||||||
x => x.designerId == designerId && x.columnName == column.columnName
|
x => x.designerId == designerId && x.columnName == column.columnName
|
||||||
@@ -115,16 +121,27 @@
|
|||||||
})}
|
})}
|
||||||
use:contextMenu={settings?.canSelectColumns ? createMenu : '__no_menu'}
|
use:contextMenu={settings?.canSelectColumns ? createMenu : '__no_menu'}
|
||||||
>
|
>
|
||||||
|
{#if nestingSupported}
|
||||||
|
<span class="expandColumnIcon" style={`margin-right: ${5 + expandLevel * 10}px`}>
|
||||||
|
<FontIcon
|
||||||
|
icon={isExpandable ? plusExpandIcon(isExpanded) : 'icon invisible-box'}
|
||||||
|
on:click={() => {
|
||||||
|
toggleExpanded(!isExpanded);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
|
||||||
{#if settings?.allowColumnOperations}
|
{#if settings?.allowColumnOperations}
|
||||||
<CheckboxField
|
<CheckboxField
|
||||||
checked={settings?.isColumnChecked
|
checked={settings?.isColumnChecked
|
||||||
? settings?.isColumnChecked(designerId, column.columnName)
|
? settings?.isColumnChecked(designerId, column)
|
||||||
: !!(designer.columns || []).find(
|
: !!(designer.columns || []).find(
|
||||||
x => x.designerId == designerId && x.columnName == column.columnName && x.isOutput
|
x => x.designerId == designerId && x.columnName == column.columnName && x.isOutput
|
||||||
)}
|
)}
|
||||||
on:change={e => {
|
on:change={e => {
|
||||||
if (settings?.setColumnChecked) {
|
if (settings?.setColumnChecked) {
|
||||||
settings?.setColumnChecked(designerId, column.columnName, e.target.checked);
|
settings?.setColumnChecked(designerId, column, e.target.checked);
|
||||||
} else {
|
} else {
|
||||||
if (e.target.checked) {
|
if (e.target.checked) {
|
||||||
onChangeColumn(
|
onChangeColumn(
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { presetDarkPalettes, presetPalettes } from '@ant-design/colors';
|
import { presetDarkPalettes, presetPalettes } from '@ant-design/colors';
|
||||||
import { computeDbDiffRows } from 'dbgate-tools';
|
import { filterName } from 'dbgate-tools';
|
||||||
|
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
import { createDatabaseObjectMenu } from '../appobj/DatabaseObjectAppObject.svelte';
|
import { createDatabaseObjectMenu } from '../appobj/DatabaseObjectAppObject.svelte';
|
||||||
@@ -68,6 +68,27 @@
|
|||||||
$: specificDb = settings?.tableSpecificDb ? settings?.tableSpecificDb(designerId) : null;
|
$: specificDb = settings?.tableSpecificDb ? settings?.tableSpecificDb(designerId) : null;
|
||||||
$: filterParentRows = settings?.hasFilterParentRowsFlag ? settings?.hasFilterParentRowsFlag(designerId) : false;
|
$: filterParentRows = settings?.hasFilterParentRowsFlag ? settings?.hasFilterParentRowsFlag(designerId) : false;
|
||||||
$: isGrayed = settings?.isGrayedTable ? settings?.isGrayedTable(designerId) : false;
|
$: isGrayed = settings?.isGrayedTable ? settings?.isGrayedTable(designerId) : false;
|
||||||
|
$: flatColumns = getFlatColumns(columns, '', 0);
|
||||||
|
|
||||||
|
function getFlatColumns(columns, filter, level) {
|
||||||
|
if (!columns) return [];
|
||||||
|
const res = [];
|
||||||
|
for (const col of columns) {
|
||||||
|
if (filterName(filter, col.columnName)) {
|
||||||
|
res.push({ ...col, expandLevel: level });
|
||||||
|
if (col.isExpanded) {
|
||||||
|
res.push(...getFlatColumns(col.getChildColumns ? col.getChildColumns() : null, filter, level + 1));
|
||||||
|
}
|
||||||
|
} else if (col.isExpanded) {
|
||||||
|
const children = getFlatColumns(col.getChildColumns ? col.getChildColumns() : null, filter, level + 1);
|
||||||
|
if (children.length > 0) {
|
||||||
|
res.push({ ...col, expandLevel: level });
|
||||||
|
res.push(...children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
export function isSelected() {
|
export function isSelected() {
|
||||||
return table?.isSelectedTable;
|
return table?.isSelectedTable;
|
||||||
@@ -214,7 +235,7 @@
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// $: console.log('COLUMNS', columns);
|
// $: console.log('COLUMNS', flatColumns);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -279,8 +300,13 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="columns" on:scroll={() => tick().then(onMoveReferences)} class:scroll={settings?.allowScrollColumns}>
|
<div class="columns" on:scroll={() => tick().then(onMoveReferences)} class:scroll={settings?.allowScrollColumns}>
|
||||||
{#each columns || [] as column}
|
{#each flatColumns || [] as column}
|
||||||
<ColumnLine
|
<ColumnLine
|
||||||
|
nestingSupported={!!columns.find(x => x.getChildColumns)}
|
||||||
|
isExpandable={!!column.getChildColumns}
|
||||||
|
isExpanded={column.isExpanded}
|
||||||
|
expandLevel={column.expandLevel}
|
||||||
|
toggleExpanded={column.toggleExpanded}
|
||||||
{column}
|
{column}
|
||||||
{table}
|
{table}
|
||||||
{designer}
|
{designer}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import {
|
||||||
|
ChangePerspectiveConfigFunc,
|
||||||
createPerspectiveNodeConfig,
|
createPerspectiveNodeConfig,
|
||||||
|
PerspectiveDataPatternColumn,
|
||||||
|
PerspectiveNodeConfig,
|
||||||
perspectiveNodesHaveStructure,
|
perspectiveNodesHaveStructure,
|
||||||
PerspectiveTreeNode,
|
PerspectiveTreeNode,
|
||||||
switchPerspectiveReferenceDirection,
|
switchPerspectiveReferenceDirection,
|
||||||
@@ -28,6 +31,32 @@
|
|||||||
|
|
||||||
export let onClickTableHeader = null;
|
export let onClickTableHeader = null;
|
||||||
|
|
||||||
|
function mapDataPatternColumn(
|
||||||
|
column: PerspectiveDataPatternColumn,
|
||||||
|
node: PerspectiveNodeConfig,
|
||||||
|
codeNamePrefix: string
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
columnName: column.name,
|
||||||
|
getChildColumns:
|
||||||
|
column.columns?.length > 0
|
||||||
|
? () => column.columns.map(x => mapDataPatternColumn(x, node, codeNamePrefix + column.name + '::'))
|
||||||
|
: null,
|
||||||
|
isExpanded: node.expandedColumns.includes(codeNamePrefix + column.name),
|
||||||
|
codeName: codeNamePrefix + column.name,
|
||||||
|
toggleExpanded: value =>
|
||||||
|
setConfig(cfg => ({
|
||||||
|
...cfg,
|
||||||
|
nodes: cfg.nodes.map(node => ({
|
||||||
|
...node,
|
||||||
|
expandedColumns: value
|
||||||
|
? [...(node.expandedColumns || []), codeNamePrefix + column.name]
|
||||||
|
: (node.expandedColumns || []).filter(x => x != codeNamePrefix + column.name),
|
||||||
|
})),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function createDesignerModel(
|
function createDesignerModel(
|
||||||
config: PerspectiveConfig,
|
config: PerspectiveConfig,
|
||||||
dbInfos: MultipleDatabaseInfo,
|
dbInfos: MultipleDatabaseInfo,
|
||||||
@@ -49,10 +78,7 @@
|
|||||||
if (!pattern) return null;
|
if (!pattern) return null;
|
||||||
collection = {
|
collection = {
|
||||||
...collection,
|
...collection,
|
||||||
columns:
|
columns: pattern?.columns.map(x => mapDataPatternColumn(x, node, '')) || [],
|
||||||
pattern?.columns.map(x => ({
|
|
||||||
columnName: x.name,
|
|
||||||
})) || [],
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,10 +226,10 @@
|
|||||||
];
|
];
|
||||||
},
|
},
|
||||||
createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'),
|
createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'),
|
||||||
isColumnChecked: (designerId, columnName) => {
|
isColumnChecked: (designerId, column) => {
|
||||||
return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(columnName);
|
return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(column.codeName);
|
||||||
},
|
},
|
||||||
setColumnChecked: (designerId, columnName, value) => {
|
setColumnChecked: (designerId, column, value) => {
|
||||||
setConfig(cfg => ({
|
setConfig(cfg => ({
|
||||||
...cfg,
|
...cfg,
|
||||||
nodes: cfg.nodes.map(node =>
|
nodes: cfg.nodes.map(node =>
|
||||||
@@ -211,8 +237,8 @@
|
|||||||
? {
|
? {
|
||||||
...node,
|
...node,
|
||||||
checkedColumns: value
|
checkedColumns: value
|
||||||
? [...(node.checkedColumns || []), columnName]
|
? [...(node.checkedColumns || []), column.codeName]
|
||||||
: (node.checkedColumns || []).filter(x => x != columnName),
|
: (node.checkedColumns || []).filter(x => x != column.codeName),
|
||||||
}
|
}
|
||||||
: node
|
: node
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user