From 629570101e83d3eceef9caf7e9fedf1d41810036 Mon Sep 17 00:00:00 2001 From: Leto Date: Thu, 27 Jun 2024 23:19:17 +0800 Subject: [PATCH 1/8] chore(dashboard): add @dnd-kit deps --- dashboard/package.json | 3 + yarn.lock | 152 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/dashboard/package.json b/dashboard/package.json index 8d43a2835..bcd3b1af8 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -34,6 +34,9 @@ "coverage": "vitest --coverage" }, "dependencies": { + "@dnd-kit/helpers": "^0.0.3", + "@dnd-kit/react": "^0.0.4", + "@dnd-kit/sortable": "^8.0.0", "@json2csv/whatwg": "7.0.3", "@monaco-editor/react": "4.4.6", "@types/chroma-js": "^2.1.4", diff --git a/yarn.lock b/yarn.lock index 659bafe4d..334148d90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1635,6 +1635,9 @@ __metadata: version: 0.0.0-use.local resolution: "@devtable/dashboard@workspace:dashboard" dependencies: + "@dnd-kit/helpers": ^0.0.3 + "@dnd-kit/react": ^0.0.4 + "@dnd-kit/sortable": ^8.0.0 "@emotion/babel-plugin": 11.11.0 "@faker-js/faker": 7.6.0 "@json2csv/whatwg": 7.0.3 @@ -1938,6 +1941,141 @@ __metadata: languageName: unknown linkType: soft +"@dnd-kit/abstract@npm:^0.0.3": + version: 0.0.3 + resolution: "@dnd-kit/abstract@npm:0.0.3" + dependencies: + "@dnd-kit/geometry": ^0.0.3 + "@dnd-kit/state": ^0.0.3 + tslib: ^2.6.2 + checksum: 5af51d17bbddb695f2cef98037aaf28f7ddba0d182fac9f0b19ed0143ac7ed117262545d141e3c9c6e92215bba456b39bf89a851702f4ade79f8fd7e55db17b5 + languageName: node + linkType: hard + +"@dnd-kit/abstract@npm:^0.0.4": + version: 0.0.4 + resolution: "@dnd-kit/abstract@npm:0.0.4" + dependencies: + "@dnd-kit/geometry": ^0.0.4 + "@dnd-kit/state": ^0.0.4 + tslib: ^2.6.2 + checksum: ffea4733a44aa31cfe9c6c65055a927bf3daaf4cfae98eff945dcc952d7c3beb713e69145f08e9c753dbcea81eebbdc12babe2bffae868689ad33f8ee23f0e66 + languageName: node + linkType: hard + +"@dnd-kit/collision@npm:^0.0.4": + version: 0.0.4 + resolution: "@dnd-kit/collision@npm:0.0.4" + dependencies: + "@dnd-kit/abstract": ^0.0.4 + "@dnd-kit/geometry": ^0.0.4 + tslib: ^2.6.2 + checksum: f2cb12da7e143e8ac1178a50af531bacd19efb5eb379222e779c8ca7055aaa99aa9aaffafa0db44129139fefdb575eb2a86f662b831fa4ef385795e20ab66fa8 + languageName: node + linkType: hard + +"@dnd-kit/dom@npm:^0.0.4": + version: 0.0.4 + resolution: "@dnd-kit/dom@npm:0.0.4" + dependencies: + "@dnd-kit/abstract": ^0.0.4 + "@dnd-kit/collision": ^0.0.4 + "@dnd-kit/geometry": ^0.0.4 + "@dnd-kit/state": ^0.0.4 + tslib: ^2.6.2 + checksum: a138904cda47cfc57fce6231b4c42df33a5eb19a9457121c260edf8a95ea28e8a251d69bcff38a80e76f51874e64b0fe28ed2d8916dcb6512d0f4a46df96fb41 + languageName: node + linkType: hard + +"@dnd-kit/geometry@npm:^0.0.3": + version: 0.0.3 + resolution: "@dnd-kit/geometry@npm:0.0.3" + dependencies: + "@dnd-kit/state": ^0.0.3 + tslib: ^2.6.2 + checksum: 7fa8403c4a8343cc588f4974a9b3ed827eb3799d0780d184986f1bdcc880e0d289e67df4d223989598dba65347b0e32f73f0d7da3bd9d05016cb505d8bfd60d0 + languageName: node + linkType: hard + +"@dnd-kit/geometry@npm:^0.0.4": + version: 0.0.4 + resolution: "@dnd-kit/geometry@npm:0.0.4" + dependencies: + "@dnd-kit/state": ^0.0.4 + tslib: ^2.6.2 + checksum: 283246c0feab6672b9e4b5718396ce6c74eaae517d8393164214503933edf7ed398ea7267579139ebcc84eb910c98a81d4015ee66478cdf340037a3200724364 + languageName: node + linkType: hard + +"@dnd-kit/helpers@npm:^0.0.3": + version: 0.0.3 + resolution: "@dnd-kit/helpers@npm:0.0.3" + dependencies: + "@dnd-kit/abstract": ^0.0.3 + tslib: ^2.6.2 + checksum: d1884482b9260bbb6a1dba0967bd3c9c2859e861822596cb00f92c4b06a089fe60b4d30f3baeca6bdf4b0038771ff455dcf102dd39039391678a70ccb57f877a + languageName: node + linkType: hard + +"@dnd-kit/react@npm:^0.0.4": + version: 0.0.4 + resolution: "@dnd-kit/react@npm:0.0.4" + dependencies: + "@dnd-kit/abstract": ^0.0.4 + "@dnd-kit/dom": ^0.0.4 + "@dnd-kit/state": ^0.0.4 + tslib: ^2.6.2 + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 58f30c518d235a9df0f905c44ca3dbf22782255a78730e32f6baca6350a636466b1b89087238f6b9185d6a2663067c3b10ccc622cb8cd4753f292a1cf37627bd + languageName: node + linkType: hard + +"@dnd-kit/sortable@npm:^8.0.0": + version: 8.0.0 + resolution: "@dnd-kit/sortable@npm:8.0.0" + dependencies: + "@dnd-kit/utilities": ^3.2.2 + tslib: ^2.0.0 + peerDependencies: + "@dnd-kit/core": ^6.1.0 + react: ">=16.8.0" + checksum: 26589fd23c18d930a949489b232a7345c0bee4abb6be91d3673232bc79085f13cb5d82087c2068edbc51cbdd3d47c2fe386bada92dc7f2d0dcde13d6be379daa + languageName: node + linkType: hard + +"@dnd-kit/state@npm:^0.0.3": + version: 0.0.3 + resolution: "@dnd-kit/state@npm:0.0.3" + dependencies: + "@preact/signals-core": ^1.6.0 + tslib: ^2.6.2 + checksum: f3dc265c87ff6ea787989fc6f8c9dbf43fdbd7a4b4c7f859181256a79eb27dc7dbac581f78e23d2f856f211ac542a4cd3060970b6b607890f8c502d258cb75c6 + languageName: node + linkType: hard + +"@dnd-kit/state@npm:^0.0.4": + version: 0.0.4 + resolution: "@dnd-kit/state@npm:0.0.4" + dependencies: + "@preact/signals-core": ^1.6.0 + tslib: ^2.6.2 + checksum: 619ab47ed2a9c0a537f25373a1c13218506ac5951e3fe106f0f605251b689c53460022152ec6bc6cc10b7a8eba8b174277ab8e31c42b0b47b20a4865ad84d23c + languageName: node + linkType: hard + +"@dnd-kit/utilities@npm:^3.2.2": + version: 3.2.2 + resolution: "@dnd-kit/utilities@npm:3.2.2" + dependencies: + tslib: ^2.0.0 + peerDependencies: + react: ">=16.8.0" + checksum: 8a5015c2faa52760ab82a64287b2ac6a3d798867a1bca5ccbc1178560dbd9a1f9f1a21faea80f590ba1a4277c3eb7e7c4d3b4a39f1f32171bf6bc8174b370547 + languageName: node + linkType: hard + "@emotion/babel-plugin@npm:11.11.0, @emotion/babel-plugin@npm:^11.10.6": version: 11.11.0 resolution: "@emotion/babel-plugin@npm:11.11.0" @@ -3777,6 +3915,13 @@ __metadata: languageName: node linkType: hard +"@preact/signals-core@npm:^1.6.0": + version: 1.6.1 + resolution: "@preact/signals-core@npm:1.6.1" + checksum: 502a52e04107c48d578b3827cff39ca179b3742d18bba1805ee742f908bf88b19e80b3abebd4d326329c268316bde083f54d9cf99c2419775de48e9756668e6a + languageName: node + linkType: hard + "@radix-ui/number@npm:1.0.0": version: 1.0.0 resolution: "@radix-ui/number@npm:1.0.0" @@ -18053,6 +18198,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.6.2": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" From 49b2705ffc8c4a9d5139e80f564da6892df7bf8c Mon Sep 17 00:00:00 2001 From: Leto Date: Thu, 27 Jun 2024 23:19:48 +0800 Subject: [PATCH 2/8] feat(dashboard): make gradient-editor sortable --- .../continuous/gradient-editor.tsx | 140 ++++++++++++------ 1 file changed, 96 insertions(+), 44 deletions(-) diff --git a/dashboard/src/components/plugins/common-echarts-fields/visual-map/visual-map-editor/continuous/gradient-editor.tsx b/dashboard/src/components/plugins/common-echarts-fields/visual-map/visual-map-editor/continuous/gradient-editor.tsx index 6a3569661..96917f2f4 100644 --- a/dashboard/src/components/plugins/common-echarts-fields/visual-map/visual-map-editor/continuous/gradient-editor.tsx +++ b/dashboard/src/components/plugins/common-echarts-fields/visual-map/visual-map-editor/continuous/gradient-editor.tsx @@ -1,9 +1,73 @@ -import { Badge, CloseButton, ColorInput, Stack, Table } from '@mantine/core'; +import { move } from '@dnd-kit/helpers'; +import { DragDropProvider } from '@dnd-kit/react'; +import { useSortable } from '@dnd-kit/react/sortable'; +import { ActionIcon, Badge, Center, CloseButton, ColorInput, Flex, Stack } from '@mantine/core'; +import { IconGripVertical } from '@tabler/icons-react'; +import { useBoolean } from 'ahooks'; import { Ref, forwardRef, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { v4 as uuidv4 } from 'uuid'; import { PreviewGradientAndApplyPalette } from './preview-gradient-and-apply-palette'; +type ColorFieldItem = { + id: string; + value: string; +}; + +type ColorRowProps = { + color: ColorFieldItem; + handleChange: (v: string) => void; + handleRemove: () => void; + index: number; +}; +const ColorRow = ({ color, index, handleChange, handleRemove }: ColorRowProps) => { + const [hovering, { setTrue, setFalse }] = useBoolean(false); + const { ref, handleRef } = useSortable({ + id: color.id, + index, + }); + + return ( + +
+ {hovering ? ( + + + + ) : ( + {index + 1} + )} +
+
+ +
+
+ +
+
+ ); +}; + type Props = { value: string[]; onChange: (v: string[]) => void; @@ -42,53 +106,41 @@ export const GradientEditor = forwardRef(({ value, onChange }: Props, ref: Ref { + const { source, target } = event.operation; + const newColors = move(colors, source, target); + onChange(newColors.map((c) => c.value)); + }; return ( - - - {colors.map((c, index) => ( - - - - - - ))} - - - - -
- {index} - - - - remove(index)} /> -
- - - -
+ + {colors.map((c, index) => ( + remove(index)} + index={index} + /> + ))} + + +
+
+ +
+
+ ); }); From 1042bd877bb23e7e2066fb137a7995c4c211ac5a Mon Sep 17 00:00:00 2001 From: Leto Date: Sun, 30 Jun 2024 16:06:20 +0800 Subject: [PATCH 3/8] refactor(dashboard): extract TabList from FieldArrayTabs --- .../field-array-tabs/field-array-tabs.tsx | 37 +++++++---------- .../field-array-tabs/tab-list.tsx | 41 +++++++++++++++++++ .../field-array-tabs/types.ts | 5 +++ 3 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx create mode 100644 dashboard/src/components/plugins/editor-components/field-array-tabs/types.ts diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx index 903e69d7c..53db96a39 100644 --- a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx @@ -1,7 +1,9 @@ -import { Button, Center, Divider, Stack, Tabs, Tooltip } from '@mantine/core'; -import { IconPlus, IconTrash } from '@tabler/icons-react'; +import { Button, Divider, Stack, Tabs } from '@mantine/core'; +import { IconTrash } from '@tabler/icons-react'; import { ReactNode } from 'react'; import { ArrayPath, Control, FieldValues, Path, UseFormWatch, useFieldArray } from 'react-hook-form'; +import { TabList } from './tab-list'; +import { ControlledField, FieldArrayTabsChildren } from './types'; const TabsStyles = { tab: { @@ -13,7 +15,6 @@ const TabsStyles = { }, }; -type FieldArrayTabsChildren = ({ field, index }: { field: FieldItem; index: number }) => ReactNode; export type FieldArrayButtonStateFunc = ({ field, index, @@ -47,37 +48,29 @@ export const FieldArrayTabs = ({ renderTabName, deleteDisalbed, }: Props) => { - const { fields, append, remove } = useFieldArray({ + const fieldArray = useFieldArray({ control, name: name as ArrayPath, }); + const { fields, append, remove } = fieldArray; const watchFieldArray = watch(name); const controlledFields = fields.map((field, index) => { return { ...field, ...watchFieldArray[index], - }; + } as ControlledField; }); - const add = () => { - append(getItem()); - }; + return ( - - {controlledFields.map((field, index) => ( - - {renderTabName(field, index)} - - ))} - - -
- -
-
-
-
+ + fieldArray={fieldArray} + getItem={getItem} + addButtonText={addButtonText} + renderTabName={renderTabName} + controlledFields={controlledFields} + /> {controlledFields.map((field, index) => ( diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx new file mode 100644 index 000000000..38fce96ed --- /dev/null +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx @@ -0,0 +1,41 @@ +import { Center, Tabs, Tooltip } from '@mantine/core'; +import { IconPlus } from '@tabler/icons-react'; +import { ReactNode } from 'react'; +import { ArrayPath, FieldValues, UseFieldArrayReturn } from 'react-hook-form'; +import { ControlledField } from './types'; + +type Props = { + fieldArray: UseFieldArrayReturn, 'id'>; + addButtonText: string; + getItem: () => any; + renderTabName: (field: FieldItem, index: number) => ReactNode; + controlledFields: ControlledField[]; +}; + +export const TabList = ({ + fieldArray, + getItem, + addButtonText, + renderTabName, + controlledFields, +}: Props) => { + const add = () => { + fieldArray.append(getItem()); + }; + return ( + + {controlledFields.map((field, index) => ( + + {renderTabName(field, index)} + + ))} + + +
+ +
+
+
+
+ ); +}; diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/types.ts b/dashboard/src/components/plugins/editor-components/field-array-tabs/types.ts new file mode 100644 index 000000000..d025d7a0e --- /dev/null +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/types.ts @@ -0,0 +1,5 @@ +import { ReactNode } from 'react'; +import { ArrayPath, FieldArrayWithId, FieldValues, Path, PathValue } from 'react-hook-form'; + +export type ControlledField = FieldArrayWithId, 'id'> & PathValue>; +export type FieldArrayTabsChildren = ({ field, index }: { field: FieldItem; index: number }) => ReactNode; From c5e4b54e7afbf823c5110b1f298a98bc25e309b1 Mon Sep 17 00:00:00 2001 From: Leto Date: Sun, 30 Jun 2024 17:26:27 +0800 Subject: [PATCH 4/8] feat(dashboard): drag to reorder tabs --- .../field-array-tabs/field-array-tabs.tsx | 7 ++- .../field-array-tabs/tab-list.tsx | 52 ++++++++++++++++--- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx index 53db96a39..4bc2b3e7a 100644 --- a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx @@ -62,8 +62,11 @@ export const FieldArrayTabs = ({ } as ControlledField; }); + // TODO: first selected tab + const defaultTab = controlledFields[0]?.id; + return ( - + fieldArray={fieldArray} getItem={getItem} @@ -72,7 +75,7 @@ export const FieldArrayTabs = ({ controlledFields={controlledFields} /> {controlledFields.map((field, index) => ( - + {children({ field, index })} diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx index 38fce96ed..4e4017102 100644 --- a/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx @@ -1,8 +1,38 @@ import { Center, Tabs, Tooltip } from '@mantine/core'; -import { IconPlus } from '@tabler/icons-react'; +import { IconGripHorizontal, IconPlus } from '@tabler/icons-react'; import { ReactNode } from 'react'; import { ArrayPath, FieldValues, UseFieldArrayReturn } from 'react-hook-form'; import { ControlledField } from './types'; +import { DragDropProvider } from '@dnd-kit/react'; +import { move } from '@dnd-kit/helpers'; +import { useSortable } from '@dnd-kit/react/sortable'; +import { useBoolean } from 'ahooks'; + +type DraggableTabProps = { + index: number; + value: string; + children: ReactNode; +}; + +const DraggableTab = ({ value, index, children }: DraggableTabProps) => { + const [hovering, { setTrue, setFalse }] = useBoolean(false); + const { ref, handleRef } = useSortable({ + id: value, + index, + }); + + return ( + } + onMouseEnter={setTrue} + onMouseLeave={setFalse} + > + {children} + + ); +}; type Props = { fieldArray: UseFieldArrayReturn, 'id'>; @@ -19,16 +49,26 @@ export const TabList = ({ renderTabName, controlledFields, }: Props) => { + const onDragEnd = (event: any) => { + const { source, target } = event.operation; + const fromIndex = controlledFields.findIndex((f) => f.id === source.id); + const toIndex = target.index; + fieldArray.move(fromIndex, toIndex); + }; + const add = () => { fieldArray.append(getItem()); }; return ( - {controlledFields.map((field, index) => ( - - {renderTabName(field, index)} - - ))} + + {controlledFields.map((field, index) => ( + + {renderTabName(field, index)} + + ))} + +
From ad01c0465ab87599d036cd69539bdff40925ada7 Mon Sep 17 00:00:00 2001 From: Leto Date: Sun, 30 Jun 2024 17:53:31 +0800 Subject: [PATCH 5/8] feat(dashboard): auto select last tab --- .../field-array-tabs/field-array-tabs.tsx | 33 +++++++++++++++---- .../field-array-tabs/tab-list.tsx | 14 +++----- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx index 4bc2b3e7a..2b11847d1 100644 --- a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx @@ -1,6 +1,7 @@ import { Button, Divider, Stack, Tabs } from '@mantine/core'; import { IconTrash } from '@tabler/icons-react'; -import { ReactNode } from 'react'; +import _ from 'lodash'; +import { ReactNode, useEffect, useState } from 'react'; import { ArrayPath, Control, FieldValues, Path, UseFormWatch, useFieldArray } from 'react-hook-form'; import { TabList } from './tab-list'; import { ControlledField, FieldArrayTabsChildren } from './types'; @@ -36,7 +37,7 @@ type Props = { renderTabName: (field: FieldItem, index: number) => ReactNode; deleteDisalbed?: FieldArrayButtonStateFunc; }; -// TODO: first selected tab + export const FieldArrayTabs = ({ control, watch, @@ -62,14 +63,34 @@ export const FieldArrayTabs = ({ } as ControlledField; }); - // TODO: first selected tab - const defaultTab = controlledFields[0]?.id; + const defaultTab = _.last(controlledFields)?.id ?? null; + const [tab, setTab] = useState(defaultTab); + const handleTabChange = (tab: string | null) => { + if (tab === 'add') { + return; + } + setTab(tab); + }; + useEffect(() => { + setTab((t) => { + if (defaultTab === t) { + return t; + } + return defaultTab; + }); + }, [defaultTab]); + + const add = () => { + const item = getItem(); + fieldArray.append(item); + setTab(item.id); + }; return ( - + fieldArray={fieldArray} - getItem={getItem} + add={add} addButtonText={addButtonText} renderTabName={renderTabName} controlledFields={controlledFields} diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx index 4e4017102..003e249d6 100644 --- a/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/tab-list.tsx @@ -1,12 +1,11 @@ +import { DragDropProvider } from '@dnd-kit/react'; +import { useSortable } from '@dnd-kit/react/sortable'; import { Center, Tabs, Tooltip } from '@mantine/core'; import { IconGripHorizontal, IconPlus } from '@tabler/icons-react'; +import { useBoolean } from 'ahooks'; import { ReactNode } from 'react'; import { ArrayPath, FieldValues, UseFieldArrayReturn } from 'react-hook-form'; import { ControlledField } from './types'; -import { DragDropProvider } from '@dnd-kit/react'; -import { move } from '@dnd-kit/helpers'; -import { useSortable } from '@dnd-kit/react/sortable'; -import { useBoolean } from 'ahooks'; type DraggableTabProps = { index: number; @@ -37,14 +36,14 @@ const DraggableTab = ({ value, index, children }: DraggableTabProps) => { type Props = { fieldArray: UseFieldArrayReturn, 'id'>; addButtonText: string; - getItem: () => any; + add: () => void; renderTabName: (field: FieldItem, index: number) => ReactNode; controlledFields: ControlledField[]; }; export const TabList = ({ fieldArray, - getItem, + add, addButtonText, renderTabName, controlledFields, @@ -56,9 +55,6 @@ export const TabList = ({ fieldArray.move(fromIndex, toIndex); }; - const add = () => { - fieldArray.append(getItem()); - }; return ( From 47707bd66213b18c69a402763c7007fe8e736e4b Mon Sep 17 00:00:00 2001 From: Leto Date: Sun, 30 Jun 2024 17:55:53 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fix(dashboard):=20cartesian=20chart=20crash?= =?UTF-8?q?es=20when=20a=20series=20item=E2=80=99s=20data=5Fkey=20is=20emp?= =?UTF-8?q?ty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/viz-components/cartesian/option/y-axis.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dashboard/src/components/plugins/viz-components/cartesian/option/y-axis.ts b/dashboard/src/components/plugins/viz-components/cartesian/option/y-axis.ts index 0ee1dd4bf..e1ba0766e 100644 --- a/dashboard/src/components/plugins/viz-components/cartesian/option/y-axis.ts +++ b/dashboard/src/components/plugins/viz-components/cartesian/option/y-axis.ts @@ -10,6 +10,9 @@ type PartialSeriesConfType = { }; function getNumbersFromData(seriesData: SeriesDataIn): SeriesDataOut { + if (!seriesData) { + return []; + } try { if (Array.isArray(seriesData[0]) && seriesData[0]?.length >= 2) { const s = seriesData as [string | number, number][]; From 2194bac563aae5b76e688320c19b2fff676fa116 Mon Sep 17 00:00:00 2001 From: Leto Date: Sun, 30 Jun 2024 19:28:36 +0800 Subject: [PATCH 7/8] style(dashboard): misc --- .../editor-components/field-array-tabs/field-array-tabs.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx index 2b11847d1..39a7b936b 100644 --- a/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx +++ b/dashboard/src/components/plugins/editor-components/field-array-tabs/field-array-tabs.tsx @@ -8,8 +8,8 @@ import { ControlledField, FieldArrayTabsChildren } from './types'; const TabsStyles = { tab: { - paddingTop: '0px', - paddingBottom: '0px', + paddingTop: '4px', + paddingBottom: '4px', }, panel: { padding: '0px', From 84062c044b251643e1ab622754eac56f42d3dcb1 Mon Sep 17 00:00:00 2001 From: Leto Date: Sun, 30 Jun 2024 19:29:43 +0800 Subject: [PATCH 8/8] chore: publish v13.20.0 --- api/package.json | 2 +- dashboard/package.json | 2 +- package.json | 2 +- settings-form/package.json | 2 +- website/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/package.json b/api/package.json index 45b06b30a..962b16919 100644 --- a/api/package.json +++ b/api/package.json @@ -1,6 +1,6 @@ { "name": "@devtable/api", - "version": "13.19.0", + "version": "13.20.0", "description": "", "main": "index.js", "scripts": { diff --git a/dashboard/package.json b/dashboard/package.json index bcd3b1af8..19b5442d3 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@devtable/dashboard", - "version": "13.19.0", + "version": "13.20.0", "license": "Apache-2.0", "publishConfig": { "access": "public", diff --git a/package.json b/package.json index 9bac79811..0b552e0ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtable/root", - "version": "13.19.0", + "version": "13.20.0", "private": true, "workspaces": [ "api", diff --git a/settings-form/package.json b/settings-form/package.json index 40b9c340e..03a9b9397 100644 --- a/settings-form/package.json +++ b/settings-form/package.json @@ -1,6 +1,6 @@ { "name": "@devtable/settings-form", - "version": "13.19.0", + "version": "13.20.0", "license": "Apache-2.0", "publishConfig": { "access": "public", diff --git a/website/package.json b/website/package.json index 236e2ea6a..cb8326ec3 100644 --- a/website/package.json +++ b/website/package.json @@ -2,7 +2,7 @@ "name": "@devtable/website", "private": true, "license": "Apache-2.0", - "version": "13.19.0", + "version": "13.20.0", "scripts": { "dev": "vite", "preview": "vite preview"