From ec08f3222df2f33266369289db53c90563361c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=D1=81=20=D0=A1=D1=83=D0=BB=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 12 Jul 2026 20:55:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D1=80=D0=B5=D0=B2=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=B4=D0=BD=D1=8B=D0=B5=20=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B8:=20parent=5Fid,=20drag&drop,=20?= =?UTF-8?q?=D0=B4=D1=80=D0=B5=D0=B2=D0=BE=D0=B2=D0=B8=D0=B4=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=20=D0=B2=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F=D1=85=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/TableFieldMultiSelect.tsx | 56 ++- client/src/components/TableFieldSelect.tsx | 62 +-- .../directories/DirectoryRowTree.tsx | 371 ++++++++++++++++++ .../directories/DirectoryTreeMultiSelect.tsx | 182 +++++++++ .../directories/DirectoryTreeSelect.tsx | 193 +++++++++ client/src/pages/TableEditor.tsx | 328 +++++++++++++++- migrations/0055_data_table_rows_hierarchy.sql | 5 + server/routes/data-tables.routes.ts | 40 +- server/storage/data-tables-core.storage.ts | 103 ++++- shared/schema.ts | 12 +- 10 files changed, 1284 insertions(+), 68 deletions(-) create mode 100644 client/src/components/directories/DirectoryRowTree.tsx create mode 100644 client/src/components/directories/DirectoryTreeMultiSelect.tsx create mode 100644 client/src/components/directories/DirectoryTreeSelect.tsx create mode 100644 migrations/0055_data_table_rows_hierarchy.sql diff --git a/client/src/components/TableFieldMultiSelect.tsx b/client/src/components/TableFieldMultiSelect.tsx index 7ba7ed1..1a26e96 100644 --- a/client/src/components/TableFieldMultiSelect.tsx +++ b/client/src/components/TableFieldMultiSelect.tsx @@ -5,6 +5,8 @@ import { Checkbox } from '@/components/ui/checkbox'; import { Button } from '@/components/ui/button'; import { Popover, PopoverAnchor, PopoverContent } from '@/components/ui/popover'; import { Table, X } from 'lucide-react'; +import { DirectoryTreeMultiSelect } from '@/components/directories/DirectoryTreeMultiSelect'; +import type { DataTableRow } from '@shared/schema'; interface TableFieldMultiSelectProps { fieldId: number; @@ -29,7 +31,7 @@ export default function TableFieldMultiSelect({ const { data: tableData, isLoading, error } = useQuery<{ table: { - rows: Array<{ id: number; values: string[] }>; + rows: DataTableRow[]; columns: Array<{ name: string }>; }; }>({ @@ -86,6 +88,8 @@ export default function TableFieldMultiSelect({ .filter(Boolean); }, [selectedValues, rows, displayColumnIndex]); + const hasHierarchy = rows.some((r) => r.parentId !== null && r.parentId !== undefined); + const toggle = (rowId: string) => { const next = new Set(selectedSet); if (next.has(rowId)) next.delete(rowId); @@ -140,26 +144,38 @@ export default function TableFieldMultiSelect({ } }} > -