Skip to content

Commit

Permalink
feat: HighLevelTable
Browse files Browse the repository at this point in the history
  • Loading branch information
dineug committed Nov 11, 2023
1 parent ce8f162 commit 28c30fc
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 45 deletions.
16 changes: 12 additions & 4 deletions packages/erd-editor/src/components/erd/Erd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,22 @@ const Erd: FC<ErdProps> = (props, ctx) => {
const el = event.target as HTMLElement | null;
if (!el) return;

const canDrag =
const canUnselectAll =
!el.closest('.table') &&
!el.closest('.memo') &&
!el.closest('.edit-input');
if (!canDrag) return;

const { store } = app.value;
store.dispatch(unselectAllAction$());
const canDrag =
canUnselectAll &&
!el.closest('.minimap') &&
!el.closest('.minimap-viewport');

if (canUnselectAll) {
const { store } = app.value;
store.dispatch(unselectAllAction$());
}

if (!canDrag) return;

if (isMouseEvent(event) && isMod(event)) {
const { x, y } = root.value.getBoundingClientRect();
Expand Down
7 changes: 6 additions & 1 deletion packages/erd-editor/src/components/erd/canvas/Canvas.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { cache, FC, html, Ref, ref, repeat } from '@dineug/r-html';

import { useAppContext } from '@/components/context';
import HighLevelTable from '@/components/erd/canvas/high-level-table/HighLevelTable';
import Memo from '@/components/erd/canvas/memo/Memo';
import Table from '@/components/erd/canvas/table/Table';
import { query } from '@/utils/collection/query';
Expand Down Expand Up @@ -49,7 +50,11 @@ const Canvas: FC<CanvasProps> = (props, ctx) => {
table => table.id,
table => html`<${Table} table=${table} />`
)}`
: null
: html`${repeat(
tables,
table => table.id,
table => html`<${HighLevelTable} table=${table} />`
)}`
)}
${repeat(
memos,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { css } from '@dineug/r-html';

export const name = css`
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
overflow: auto;
word-break: break-all;
color: var(--active);
font-weight: var(--font-weight-bold);
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { FC, html } from '@dineug/r-html';

import { useAppContext } from '@/components/context';
import * as styles from '@/components/erd/canvas/table/Table.styles';
import { useMoveTable } from '@/components/erd/canvas/table/useMoveTable';
import { Table } from '@/internal-types';
import {
fontSize5,
fontSize6,
fontSize7,
fontSize8,
fontSize9,
} from '@/styles/typography.styles';
import { calcTableHeight, calcTableWidths } from '@/utils/calcTable';

import * as highLevelTableStyle from './HighLevelTable.styles';

export type HighLevelTableProps = {
table: Table;
};

const HighLevelTable: FC<HighLevelTableProps> = (props, ctx) => {
const app = useAppContext(ctx);
const { onMoveStart } = useMoveTable(ctx, props);

const fontSize = () => {
const { store } = app.value;
const {
settings: { zoomLevel },
} = store.state;
let fontSize = fontSize5.toString();

if (zoomLevel > 0.6) {
fontSize = fontSize5.toString();
} else if (zoomLevel > 0.5) {
fontSize = fontSize6.toString();
} else if (zoomLevel > 0.4) {
fontSize = fontSize7.toString();
} else if (zoomLevel > 0.3) {
fontSize = fontSize8.toString();
} else {
fontSize = fontSize9.toString();
}

return fontSize;
};

return () => {
const { store } = app.value;
const { table } = props;
const selected = Boolean(store.state.editor.selectedMap[table.id]);
const tableWidths = calcTableWidths(table, store.state);
const height = calcTableHeight(table);

return html`
<div
class=${['table', styles.root]}
style=${{
top: `${table.ui.y}px`,
left: `${table.ui.x}px`,
'z-index': `${table.ui.zIndex}`,
width: `${tableWidths.width}px`,
height: `${height}px`,
}}
?data-selected=${selected}
@mousedown=${onMoveStart}
@touchstart=${onMoveStart}
>
<div class=${styles.header}>
<div
class=${['table-header-color', styles.headerColor]}
style=${{
'background-color': table.ui.color,
}}
></div>
</div>
<div class=${['scrollbar', highLevelTableStyle.name, fontSize()]}>
${table.name}
</div>
</div>
`;
};
};

export default HighLevelTable;
38 changes: 6 additions & 32 deletions packages/erd-editor/src/components/erd/canvas/table/Table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,23 @@ import {
editTableEndAction,
focusTableAction,
} from '@/engine/modules/editor/atom.actions';
import { moveAllAction$ } from '@/engine/modules/editor/generator.actions';
import { FocusType } from '@/engine/modules/editor/state';
import {
changeTableCommentAction,
changeTableNameAction,
} from '@/engine/modules/table/atom.actions';
import {
removeTableAction$,
selectTableAction$,
} from '@/engine/modules/table/generator.actions';
import { removeTableAction$ } from '@/engine/modules/table/generator.actions';
import { addColumnAction$ } from '@/engine/modules/tableColumn/generator.actions';
import { Table } from '@/internal-types';
import { bHas } from '@/utils/bit';
import { calcTableHeight, calcTableWidths } from '@/utils/calcTable';
import { query } from '@/utils/collection/query';
import { onPrevent } from '@/utils/domEvent';
import { drag$, DragMove } from '@/utils/globalEventObservable';
import { isMod, simpleShortcutToString } from '@/utils/keyboard-shortcut';
import { simpleShortcutToString } from '@/utils/keyboard-shortcut';

import * as styles from './Table.styles';
import { useFocusTable } from './useFocusTable';
import { useMoveTable } from './useMoveTable';

export type TableProps = {
table: Table;
Expand All @@ -42,29 +38,7 @@ const Table: FC<TableProps> = (props, ctx) => {
ctx,
props.table.id
);

const handleMove = ({ event, movementX, movementY }: DragMove) => {
event.type === 'mousemove' && event.preventDefault();
const { store } = app.value;
store.dispatch(moveAllAction$(movementX, movementY));
};

const handleMoveStart = (event: MouseEvent | TouchEvent) => {
const el = event.target as HTMLElement | null;
if (!el) return;

const { store } = app.value;
store.dispatch(selectTableAction$(props.table.id, isMod(event)));

if (
!el.closest('.table-header-color') &&
!el.closest('.column-row') &&
!el.closest('.icon') &&
!el.closest('.input-padding')
) {
drag$.subscribe(handleMove);
}
};
const { onMoveStart } = useMoveTable(ctx, props);

const handleAddColumn = () => {
const { store } = app.value;
Expand Down Expand Up @@ -133,8 +107,8 @@ const Table: FC<TableProps> = (props, ctx) => {
height: `${height}px`,
}}
?data-selected=${selected}
@mousedown=${handleMoveStart}
@touchstart=${handleMoveStart}
@mousedown=${onMoveStart}
@touchstart=${onMoveStart}
>
<div class=${styles.header}>
<div
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { useAppContext } from '@/components/context';
import { moveAllAction$ } from '@/engine/modules/editor/generator.actions';
import { selectTableAction$ } from '@/engine/modules/table/generator.actions';
import { Ctx, Table } from '@/internal-types';
import { drag$, DragMove } from '@/utils/globalEventObservable';
import { isMod } from '@/utils/keyboard-shortcut';

export function useMoveTable(ctx: Ctx, props: { table: Table }) {
const app = useAppContext(ctx);

const handleMove = ({ event, movementX, movementY }: DragMove) => {
event.type === 'mousemove' && event.preventDefault();
const { store } = app.value;
store.dispatch(moveAllAction$(movementX, movementY));
};

const onMoveStart = (event: MouseEvent | TouchEvent) => {
const el = event.target as HTMLElement | null;
if (!el) return;

const { store } = app.value;
store.dispatch(selectTableAction$(props.table.id, isMod(event)));

if (
!el.closest('.table-header-color') &&
!el.closest('.column-row') &&
!el.closest('.icon') &&
!el.closest('.input-padding')
) {
drag$.subscribe(handleMove);
}
};

return {
onMoveStart,
};
}
11 changes: 4 additions & 7 deletions packages/erd-editor/src/components/erd/minimap/Minimap.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import { createRef, FC, html, ref, repeat } from '@dineug/r-html';

import { useAppContext } from '@/components/context';
import * as CanvasStyle from '@/components/erd/canvas/Canvas.styles';
import * as canvasStyle from '@/components/erd/canvas/Canvas.styles';
import Memo from '@/components/erd/minimap/memo/Memo';
import Table from '@/components/erd/minimap/table/Table';
import { useMinimapScroll } from '@/components/erd/minimap/useMinimapScroll';
import Viewport from '@/components/erd/minimap/viewport/Viewport';
import { MINIMAP_MARGIN, MINIMAP_SIZE } from '@/constants/layout';
import { scrollToAction } from '@/engine/modules/settings/atom.actions';
import { query } from '@/utils/collection/query';
import { isMouseEvent } from '@/utils/domEvent';
import { forwardMoveStartEvent } from '@/utils/internalEvents';

import * as styles from './Minimap.styles';
import { useMinimapScroll } from './useMinimapScroll';

const BORDER = 1;

Expand Down Expand Up @@ -62,7 +61,6 @@ const Minimap: FC<MinimapProps> = (props, ctx) => {
};

const handleMove = (event: MouseEvent | TouchEvent) => {
event.stopPropagation();
const { store } = app.value;
const {
editor: { viewport },
Expand Down Expand Up @@ -91,7 +89,6 @@ const Minimap: FC<MinimapProps> = (props, ctx) => {
})
);

ctx.host.dispatchEvent(forwardMoveStartEvent({ originEvent: event }));
onScrollStart(event);
};

Expand All @@ -113,14 +110,14 @@ const Minimap: FC<MinimapProps> = (props, ctx) => {

return html`
<div
class=${styles.minimap}
class=${['minimap', styles.minimap]}
style=${styleMap()}
${ref(minimap)}
@mousedown=${handleMove}
@touchstart=${handleMove}
>
<div
class=${CanvasStyle.root}
class=${canvasStyle.root}
style=${{
width: `${width}px`,
height: `${height}px`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ const Viewport: FC<ViewportProps> = (props, ctx) => {

return () => html`
<div
class=${[styles.viewport, { selected: state.selected || props.selected }]}
class=${[
'minimap-viewport',
styles.viewport,
{ selected: state.selected || props.selected },
]}
style=${styleMap()}
@mousedown=${onScrollStart}
@touchstart=${onScrollStart}
Expand Down

0 comments on commit 28c30fc

Please sign in to comment.