torch-glare 2.3.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/apps/lib/components/ActionButton.tsx +7 -12
- package/apps/lib/components/ActionsGroup.tsx +4 -15
- package/apps/lib/components/AlertDialog.tsx +173 -191
- package/apps/lib/components/Avatar.tsx +13 -16
- package/apps/lib/components/Badge.tsx +7 -3
- package/apps/lib/components/BadgeField.tsx +76 -71
- package/apps/lib/components/Breadcrumb.tsx +49 -85
- package/apps/lib/components/Button.tsx +20 -19
- package/apps/lib/components/ButtonGroup.tsx +31 -41
- package/apps/lib/components/Calendar.tsx +51 -29
- package/apps/lib/components/Card.tsx +2 -13
- package/apps/lib/components/ChartBlockTool.ts +17 -52
- package/apps/lib/components/Checkbox.tsx +9 -16
- package/apps/lib/components/ContextMenu.tsx +110 -106
- package/apps/lib/components/CountBadge.tsx +4 -6
- package/apps/lib/components/DataTable.tsx +196 -216
- package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
- package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
- package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
- package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
- package/apps/lib/components/DataViews/FilterPanel.tsx +173 -150
- package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
- package/apps/lib/components/DataViews/InboxView.tsx +22 -68
- package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
- package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
- package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
- package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
- package/apps/lib/components/DataViews/TableView.tsx +8 -28
- package/apps/lib/components/DataViews/TreeView.tsx +12 -40
- package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
- package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
- package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +87 -0
- package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
- package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
- package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
- package/apps/lib/components/DataViews/index.ts +26 -26
- package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
- package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
- package/apps/lib/components/DataViews/types.ts +111 -114
- package/apps/lib/components/DatePicker.tsx +198 -191
- package/apps/lib/components/Dialog.tsx +92 -105
- package/apps/lib/components/Divider.tsx +21 -24
- package/apps/lib/components/Drawer.tsx +79 -139
- package/apps/lib/components/DropdownMenu.tsx +144 -181
- package/apps/lib/components/FieldHint.tsx +4 -11
- package/apps/lib/components/Form.tsx +146 -155
- package/apps/lib/components/FormStepper.tsx +9 -39
- package/apps/lib/components/HeaderBar.tsx +119 -0
- package/apps/lib/components/ImageAttachment.tsx +111 -73
- package/apps/lib/components/InnerLabelField.tsx +20 -16
- package/apps/lib/components/Input.tsx +171 -172
- package/apps/lib/components/InputField.tsx +44 -45
- package/apps/lib/components/InputOTP.tsx +68 -69
- package/apps/lib/components/Label.tsx +31 -35
- package/apps/lib/components/LabelField.tsx +4 -5
- package/apps/lib/components/LabeledCheckBox.tsx +8 -12
- package/apps/lib/components/LabeledRadio.tsx +7 -5
- package/apps/lib/components/LinkButton.tsx +2 -9
- package/apps/lib/components/LoginButton.tsx +4 -9
- package/apps/lib/components/PasswordLevel.tsx +5 -5
- package/apps/lib/components/Popover.tsx +15 -33
- package/apps/lib/components/ProfileMenu.tsx +67 -72
- package/apps/lib/components/Radio.tsx +1 -5
- package/apps/lib/components/RadioCard.tsx +9 -28
- package/apps/lib/components/ScrollArea.tsx +45 -43
- package/apps/lib/components/SearchField.tsx +49 -39
- package/apps/lib/components/SearchableSelect.tsx +46 -52
- package/apps/lib/components/SearchableTable.tsx +199 -219
- package/apps/lib/components/SearchableTree.tsx +469 -0
- package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
- package/apps/lib/components/SectionBlock.tsx +4 -16
- package/apps/lib/components/Select.tsx +53 -80
- package/apps/lib/components/SimpleSelect.tsx +196 -187
- package/apps/lib/components/Skeleton.tsx +9 -12
- package/apps/lib/components/SlideDatePicker.tsx +215 -166
- package/apps/lib/components/SpinLoading.tsx +33 -49
- package/apps/lib/components/Stepper.tsx +13 -56
- package/apps/lib/components/Switch.tsx +8 -10
- package/apps/lib/components/TabFormItem.tsx +3 -12
- package/apps/lib/components/TabSwitch.tsx +7 -34
- package/apps/lib/components/Table.tsx +60 -75
- package/apps/lib/components/TableDnDWrapper.ts +15 -48
- package/apps/lib/components/TextEditor.tsx +93 -104
- package/apps/lib/components/Textarea.tsx +8 -12
- package/apps/lib/components/Timeline.tsx +21 -41
- package/apps/lib/components/Toast.tsx +83 -83
- package/apps/lib/components/Toggle.tsx +112 -114
- package/apps/lib/components/ToggleButton.tsx +1 -1
- package/apps/lib/components/Tooltip.tsx +24 -19
- package/apps/lib/components/TransparentLabel.tsx +61 -62
- package/apps/lib/components/TreeDropDown.tsx +86 -52
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
- package/apps/lib/components/TreeFolder/icons.tsx +14 -17
- package/apps/lib/components/TreeFolder/index.ts +15 -8
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
- package/apps/lib/components/TreeFolder/types.ts +32 -32
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
- package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
- package/apps/lib/hooks/useClickOutside.ts +21 -20
- package/apps/lib/hooks/useDataViewsState.ts +86 -80
- package/apps/lib/hooks/useIsMobile.ts +12 -12
- package/apps/lib/hooks/useResize.ts +54 -65
- package/apps/lib/hooks/useTagSelection.ts +201 -201
- package/apps/lib/layouts/CNLayout.tsx +181 -140
- package/apps/lib/layouts/DataViewCard.tsx +4 -18
- package/apps/lib/layouts/FieldSection.tsx +2 -6
- package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
- package/apps/lib/providers/ThemeProvider.tsx +8 -23
- package/apps/lib/registry.json +1004 -0
- package/apps/lib/tsconfig.json +9 -0
- package/apps/lib/utils/cn.ts +1 -1
- package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
- package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
- package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
- package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
- package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
- package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
- package/apps/lib/utils/dateFormat.ts +64 -54
- package/apps/lib/utils/markdownParser.ts +2 -7
- package/apps/lib/utils/resize.ts +21 -25
- package/apps/lib/utils/types.ts +13 -13
- package/dist/bin/index.js +8 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
- package/dist/src/shared/getAvailableFiles.js +6 -1
- package/dist/src/shared/getAvailableFiles.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +7 -0
- package/dist/src/shared/loadRegistry.d.ts.map +1 -0
- package/dist/src/shared/loadRegistry.js +31 -0
- package/dist/src/shared/loadRegistry.js.map +1 -0
- package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
- package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
- package/dist/src/shared/resolveInstallPlan.js +39 -0
- package/dist/src/shared/resolveInstallPlan.js.map +1 -0
- package/dist/src/types/main.d.ts +24 -0
- package/dist/src/types/main.d.ts.map +1 -1
- package/docs/README.md +10 -2
- package/docs/components/action-button.md +30 -24
- package/docs/components/actions-group.md +26 -20
- package/docs/components/alert-dialog.md +45 -45
- package/docs/components/avatar.md +6 -2
- package/docs/components/badge-field.md +6 -2
- package/docs/components/badge.md +7 -1
- package/docs/components/breadcrumb.md +15 -40
- package/docs/components/button-group.md +13 -10
- package/docs/components/button.md +58 -33
- package/docs/components/calendar.md +26 -19
- package/docs/components/card.md +19 -16
- package/docs/components/chart-block-tool.md +128 -0
- package/docs/components/checkbox.md +16 -8
- package/docs/components/cn-layout.md +7 -1
- package/docs/components/context-menu.md +47 -24
- package/docs/components/count-badge.md +7 -1
- package/docs/components/data-table.md +45 -33
- package/docs/components/data-views-config-panel.md +18 -14
- package/docs/components/data-views-layout.md +20 -17
- package/docs/components/date-picker.md +30 -23
- package/docs/components/dialog.md +43 -42
- package/docs/components/divider.md +10 -4
- package/docs/components/drawer.md +8 -33
- package/docs/components/dropdown-menu.md +51 -32
- package/docs/components/field-hint.md +37 -25
- package/docs/components/field-section.md +9 -3
- package/docs/components/form-stepper.md +6 -0
- package/docs/components/form.md +17 -20
- package/docs/components/header-bar.md +187 -0
- package/docs/components/image-attachment.md +33 -41
- package/docs/components/inbox-view.md +16 -5
- package/docs/components/inner-label-field.md +34 -24
- package/docs/components/input-field.md +18 -10
- package/docs/components/input-otp.md +14 -11
- package/docs/components/input.md +22 -16
- package/docs/components/kanban-view.md +15 -5
- package/docs/components/label-field.md +32 -22
- package/docs/components/label.md +43 -32
- package/docs/components/labeled-check-box.md +16 -8
- package/docs/components/labeled-radio.md +18 -11
- package/docs/components/link-button.md +7 -1
- package/docs/components/login-button.md +8 -2
- package/docs/components/password-level.md +37 -24
- package/docs/components/popover.md +26 -23
- package/docs/components/profile-menu.md +38 -27
- package/docs/components/radio-card.md +16 -9
- package/docs/components/radio.md +16 -8
- package/docs/components/scroll-area.md +6 -2
- package/docs/components/search-field.md +14 -6
- package/docs/components/searchable-select.md +19 -14
- package/docs/components/searchable-table.md +60 -41
- package/docs/components/searchable-tree-dialog.md +190 -0
- package/docs/components/searchable-tree.md +200 -0
- package/docs/components/section-block.md +130 -4
- package/docs/components/select.md +23 -18
- package/docs/components/simple-select.md +14 -10
- package/docs/components/skeleton.md +43 -33
- package/docs/components/slide-date-picker.md +37 -29
- package/docs/components/spin-loading.md +32 -23
- package/docs/components/stepper.md +6 -0
- package/docs/components/switch.md +14 -6
- package/docs/components/tab-form-item.md +7 -1
- package/docs/components/tab-switch.md +13 -6
- package/docs/components/table-dnd-wrapper.md +105 -0
- package/docs/components/table-view.md +15 -5
- package/docs/components/table.md +28 -28
- package/docs/components/text-editor.md +19 -13
- package/docs/components/textarea.md +15 -7
- package/docs/components/timeline.md +6 -0
- package/docs/components/toast.md +35 -26
- package/docs/components/toggle-button.md +24 -21
- package/docs/components/toggle.md +23 -15
- package/docs/components/tooltip.md +42 -30
- package/docs/components/transparent-label.md +29 -20
- package/docs/components/tree-drop-down.md +31 -23
- package/docs/components/tree-sub-layout.md +6 -2
- package/docs/components/tree-view.md +16 -5
- package/docs/explanation/architecture.md +54 -0
- package/docs/explanation/design-system.md +52 -0
- package/docs/how-to/data-views-from-backend-response.md +7 -4
- package/docs/how-to/guides.md +24 -18
- package/docs/migration/changelog.md +38 -0
- package/docs/reference/cli.md +87 -0
- package/docs/reference/components.md +11 -12
- package/docs/reference/hooks.md +8 -8
- package/docs/reference/providers.md +22 -22
- package/docs/reference/tailwind-plugins.md +2 -2
- package/docs/reference/theme.md +85 -0
- package/docs/reference/types.md +4 -4
- package/docs/reference/utilities.md +19 -26
- package/docs/tutorials/building-first-form.md +20 -13
- package/docs/tutorials/component-composition.md +34 -50
- package/docs/tutorials/getting-started.md +2 -2
- package/docs/tutorials/theming-basics.md +13 -10
- package/package.json +31 -3
- package/dist/src/commands/block.d.ts +0 -5
- package/dist/src/commands/block.d.ts.map +0 -1
- package/dist/src/commands/block.js +0 -255
- package/dist/src/commands/block.js.map +0 -1
- package/dist/src/shared/configureFonts.d.ts +0 -6
- package/dist/src/shared/configureFonts.d.ts.map +0 -1
- package/dist/src/shared/configureFonts.js +0 -106
- package/dist/src/shared/configureFonts.js.map +0 -1
- package/dist/src/shared/configureGlobalCss.d.ts +0 -6
- package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
- package/dist/src/shared/configureGlobalCss.js +0 -154
- package/dist/src/shared/configureGlobalCss.js.map +0 -1
- package/dist/src/shared/configureTailwind.d.ts +0 -7
- package/dist/src/shared/configureTailwind.d.ts.map +0 -1
- package/dist/src/shared/configureTailwind.js +0 -163
- package/dist/src/shared/configureTailwind.js.map +0 -1
- package/dist/src/shared/detectFramework.d.ts +0 -23
- package/dist/src/shared/detectFramework.d.ts.map +0 -1
- package/dist/src/shared/detectFramework.js +0 -119
- package/dist/src/shared/detectFramework.js.map +0 -1
- package/dist/src/shared/installBaseUtils.d.ts +0 -5
- package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
- package/dist/src/shared/installBaseUtils.js +0 -79
- package/dist/src/shared/installBaseUtils.js.map +0 -1
- package/dist/src/shared/resolveAliases.d.ts +0 -24
- package/dist/src/shared/resolveAliases.d.ts.map +0 -1
- package/dist/src/shared/resolveAliases.js +0 -98
- package/dist/src/shared/resolveAliases.js.map +0 -1
|
@@ -1,233 +1,213 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { CSS } from
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { CSS } from "@dnd-kit/utilities";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from "@tanstack/react-table"
|
|
6
|
+
ColumnDef,
|
|
7
|
+
flexRender,
|
|
8
|
+
getCoreRowModel,
|
|
9
|
+
getSortedRowModel,
|
|
10
|
+
Row,
|
|
11
|
+
SortingState,
|
|
12
|
+
useReactTable,
|
|
13
|
+
getPaginationRowModel,
|
|
14
|
+
getFilteredRowModel,
|
|
15
|
+
} from "@tanstack/react-table";
|
|
16
16
|
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
} from
|
|
17
|
+
DndContext,
|
|
18
|
+
closestCenter,
|
|
19
|
+
KeyboardSensor,
|
|
20
|
+
PointerSensor,
|
|
21
|
+
useSensor,
|
|
22
|
+
useSensors,
|
|
23
|
+
DragEndEvent,
|
|
24
|
+
} from "@dnd-kit/core";
|
|
25
25
|
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} from
|
|
26
|
+
arrayMove,
|
|
27
|
+
SortableContext,
|
|
28
|
+
sortableKeyboardCoordinates,
|
|
29
|
+
useSortable,
|
|
30
|
+
verticalListSortingStrategy,
|
|
31
|
+
} from "@dnd-kit/sortable";
|
|
32
32
|
|
|
33
|
-
import {
|
|
34
|
-
|
|
35
|
-
TableBody,
|
|
36
|
-
TableCell,
|
|
37
|
-
TableHead,
|
|
38
|
-
TableHeader,
|
|
39
|
-
TableRow,
|
|
40
|
-
} from "./Table"
|
|
41
|
-
import { Checkbox } from "./Checkbox"
|
|
33
|
+
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "./Table";
|
|
34
|
+
import { Checkbox } from "./Checkbox";
|
|
42
35
|
|
|
43
36
|
interface DataTableProps<TData extends { id: string | number }, TValue> {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
columns: ColumnDef<TData, TValue>[];
|
|
38
|
+
data: TData[];
|
|
39
|
+
theme?: "dark" | "light" | "default";
|
|
40
|
+
onRowReorder?: (newData: TData[]) => void;
|
|
48
41
|
}
|
|
49
42
|
|
|
50
43
|
export function DataTable<TData extends { id: string | number }, TValue>({
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
44
|
+
columns,
|
|
45
|
+
data,
|
|
46
|
+
theme = "default",
|
|
47
|
+
onRowReorder,
|
|
55
48
|
}: DataTableProps<TData, TValue>) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
setRowSelection(newRowSelection)
|
|
107
|
-
|
|
108
|
-
onRowReorder?.(newItems)
|
|
49
|
+
const [sorting, setSorting] = React.useState<SortingState>([]);
|
|
50
|
+
const [items, setItems] = React.useState<TData[]>(data);
|
|
51
|
+
const [rowSelection, setRowSelection] = React.useState({});
|
|
52
|
+
|
|
53
|
+
const sensors = useSensors(
|
|
54
|
+
useSensor(PointerSensor),
|
|
55
|
+
useSensor(KeyboardSensor, {
|
|
56
|
+
coordinateGetter: sortableKeyboardCoordinates,
|
|
57
|
+
}),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const table = useReactTable({
|
|
61
|
+
data: items,
|
|
62
|
+
columns,
|
|
63
|
+
getCoreRowModel: getCoreRowModel(),
|
|
64
|
+
getSortedRowModel: getSortedRowModel(),
|
|
65
|
+
getPaginationRowModel: getPaginationRowModel(),
|
|
66
|
+
getFilteredRowModel: getFilteredRowModel(),
|
|
67
|
+
onSortingChange: setSorting,
|
|
68
|
+
onRowSelectionChange: setRowSelection,
|
|
69
|
+
enableRowSelection: true,
|
|
70
|
+
enableMultiRowSelection: true,
|
|
71
|
+
state: {
|
|
72
|
+
sorting,
|
|
73
|
+
rowSelection,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const handleDragEnd = (event: DragEndEvent) => {
|
|
78
|
+
const { active, over } = event;
|
|
79
|
+
|
|
80
|
+
if (over && active.id !== over.id) {
|
|
81
|
+
const oldIndex = items.findIndex((item: TData) => item.id === active.id);
|
|
82
|
+
const newIndex = items.findIndex((item: TData) => item.id === over.id);
|
|
83
|
+
|
|
84
|
+
const newItems = arrayMove(items, oldIndex, newIndex);
|
|
85
|
+
setItems(newItems);
|
|
86
|
+
|
|
87
|
+
// Update row selection to maintain correct mapping after reorder
|
|
88
|
+
const newRowSelection: Record<string, boolean> = {};
|
|
89
|
+
Object.keys(rowSelection).forEach((rowIndex) => {
|
|
90
|
+
const oldRowIndex = parseInt(rowIndex);
|
|
91
|
+
const row = table.getRowModel().rows[oldRowIndex];
|
|
92
|
+
if (row) {
|
|
93
|
+
const newRowIndex = newItems.findIndex((item: TData) => item.id === row.original.id);
|
|
94
|
+
if (newRowIndex !== -1) {
|
|
95
|
+
newRowSelection[newRowIndex.toString()] = true;
|
|
96
|
+
}
|
|
109
97
|
}
|
|
110
|
-
|
|
98
|
+
});
|
|
99
|
+
setRowSelection(newRowSelection);
|
|
111
100
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
101
|
+
onRowReorder?.(newItems);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
|
|
107
|
+
<Table theme={theme}>
|
|
108
|
+
<TableHeader>
|
|
109
|
+
{table.getHeaderGroups().map((headerGroup) => (
|
|
110
|
+
<TableRow key={headerGroup.id}>
|
|
111
|
+
<TableHead isDummy></TableHead>
|
|
112
|
+
<TableHead isDummy>
|
|
113
|
+
<Checkbox
|
|
114
|
+
checked={table.getIsAllRowsSelected()}
|
|
115
|
+
onCheckedChange={(checked) => {
|
|
116
|
+
table.toggleAllRowsSelected(!!checked);
|
|
117
|
+
}}
|
|
118
|
+
/>
|
|
119
|
+
</TableHead>
|
|
120
|
+
{headerGroup.headers.map((header) => {
|
|
121
|
+
const sortHandler = header.column.getToggleSortingHandler();
|
|
122
|
+
return (
|
|
123
|
+
<TableHead
|
|
124
|
+
key={header.id}
|
|
125
|
+
onSort={sortHandler ? () => sortHandler({}) : undefined}
|
|
126
|
+
sortType={header.column.getIsSorted() as "asc" | "desc" | undefined}
|
|
127
|
+
>
|
|
128
|
+
{header.isPlaceholder
|
|
129
|
+
? null
|
|
130
|
+
: flexRender(header.column.columnDef.header, header.getContext())}
|
|
131
|
+
</TableHead>
|
|
132
|
+
);
|
|
133
|
+
})}
|
|
134
|
+
</TableRow>
|
|
135
|
+
))}
|
|
136
|
+
</TableHeader>
|
|
137
|
+
<TableBody>
|
|
138
|
+
{table.getRowModel().rows?.length ? (
|
|
139
|
+
<SortableContext
|
|
140
|
+
items={table.getRowModel().rows.map((row) => row.original)}
|
|
141
|
+
strategy={verticalListSortingStrategy}
|
|
142
|
+
>
|
|
143
|
+
{table.getRowModel().rows.map((row, i) => (
|
|
144
|
+
<SortableRow
|
|
145
|
+
key={i + "row"}
|
|
146
|
+
row={row}
|
|
147
|
+
state={row.getIsSelected() ? "selected" : undefined}
|
|
148
|
+
>
|
|
149
|
+
<TableCell isDummy>
|
|
150
|
+
<Checkbox
|
|
151
|
+
checked={row.getIsSelected()}
|
|
152
|
+
onCheckedChange={(checked) => {
|
|
153
|
+
row.toggleSelected(!!checked);
|
|
154
|
+
}}
|
|
155
|
+
/>
|
|
156
|
+
</TableCell>
|
|
157
|
+
{row.getVisibleCells().map((cell) => (
|
|
158
|
+
<TableCell key={cell.id}>
|
|
159
|
+
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
|
160
|
+
</TableCell>
|
|
161
|
+
))}
|
|
162
|
+
<TableCell isDummy className="w-full"></TableCell>
|
|
163
|
+
</SortableRow>
|
|
164
|
+
))}
|
|
165
|
+
</SortableContext>
|
|
166
|
+
) : (
|
|
167
|
+
<TableRow>
|
|
168
|
+
<TableCell colSpan={columns.length} className="h-24 text-center">
|
|
169
|
+
No results.
|
|
170
|
+
</TableCell>
|
|
171
|
+
</TableRow>
|
|
172
|
+
)}
|
|
173
|
+
</TableBody>
|
|
174
|
+
</Table>
|
|
175
|
+
</DndContext>
|
|
176
|
+
);
|
|
187
177
|
}
|
|
188
178
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
row: Row<TData>
|
|
194
|
-
children: React.ReactNode
|
|
195
|
-
state?: "delete" | "update" | "add" | "selected" | "open"
|
|
179
|
+
interface SortableRowProps<TData extends { id: string | number }> {
|
|
180
|
+
row: Row<TData>;
|
|
181
|
+
children: React.ReactNode;
|
|
182
|
+
state?: "delete" | "update" | "add" | "selected" | "open";
|
|
196
183
|
}
|
|
197
184
|
|
|
198
|
-
function SortableRow<TData
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
>
|
|
228
|
-
<i className="ri-draggable text-[18px]" />
|
|
229
|
-
</TableCell>
|
|
230
|
-
{children}
|
|
231
|
-
</TableRow>
|
|
232
|
-
)
|
|
233
|
-
}
|
|
185
|
+
function SortableRow<TData extends { id: string | number }>({
|
|
186
|
+
row,
|
|
187
|
+
children,
|
|
188
|
+
state,
|
|
189
|
+
}: SortableRowProps<TData>) {
|
|
190
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
191
|
+
id: row.original.id,
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
const style = {
|
|
195
|
+
transform: CSS.Transform.toString(transform),
|
|
196
|
+
transition,
|
|
197
|
+
opacity: isDragging ? 0.5 : 1,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
return (
|
|
201
|
+
<TableRow ref={setNodeRef} style={style} state={state}>
|
|
202
|
+
<TableCell
|
|
203
|
+
{...attributes}
|
|
204
|
+
{...listeners}
|
|
205
|
+
className="cursor-grab active:cursor-grabbing"
|
|
206
|
+
isDummy
|
|
207
|
+
>
|
|
208
|
+
<i className="ri-draggable text-[18px]" />
|
|
209
|
+
</TableCell>
|
|
210
|
+
{children}
|
|
211
|
+
</TableRow>
|
|
212
|
+
);
|
|
213
|
+
}
|
|
@@ -11,12 +11,7 @@ export interface DataViewRadioProps {
|
|
|
11
11
|
className?: string;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export function DataViewRadio({
|
|
15
|
-
value,
|
|
16
|
-
label,
|
|
17
|
-
children,
|
|
18
|
-
className,
|
|
19
|
-
}: DataViewRadioProps) {
|
|
14
|
+
export function DataViewRadio({ value, label, children, className }: DataViewRadioProps) {
|
|
20
15
|
return (
|
|
21
16
|
<RadioGroupPrimitive.Item
|
|
22
17
|
value={value}
|
|
@@ -30,9 +25,16 @@ export function DataViewRadio({
|
|
|
30
25
|
<span
|
|
31
26
|
className={cn(
|
|
32
27
|
"flex h-[14px] w-[14px] shrink-0 items-center justify-center rounded-full",
|
|
33
|
-
|
|
28
|
+
// Hardcoded literals so the indicator always renders dark inside the
|
|
29
|
+
// DataView regardless of the host app's data-theme (matches the
|
|
30
|
+
// always-dark panel chrome convention). Unselected ring = the spec
|
|
31
|
+
// CheckBox-Primary border (#626467) + BorderStyle fill
|
|
32
|
+
// (rgba(255,255,255,0.05)); same tokens the shared Checkbox uses.
|
|
33
|
+
"border border-[#626467] bg-white/5 transition-colors",
|
|
34
34
|
"group-data-[state=checked]:border-transparent",
|
|
35
|
-
|
|
35
|
+
// #0075FF = the previous selected-fill value (border-presentation-state-focus),
|
|
36
|
+
// now literal so the blue is theme-independent and visually unchanged.
|
|
37
|
+
"group-data-[state=checked]:bg-[#0075FF]",
|
|
36
38
|
)}
|
|
37
39
|
>
|
|
38
40
|
<RadioGroupPrimitive.Indicator className="flex items-center justify-center">
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useMemo, useState } from "react";
|
|
4
|
-
import {
|
|
5
|
-
X,
|
|
6
|
-
Settings as SettingsIcon,
|
|
7
|
-
Filter as FilterIcon,
|
|
8
|
-
Plus,
|
|
9
|
-
} from "lucide-react";
|
|
4
|
+
import { X, Settings as SettingsIcon, Filter as FilterIcon, Plus } from "lucide-react";
|
|
10
5
|
import type {
|
|
11
6
|
ViewConfig,
|
|
12
7
|
ViewType,
|
|
@@ -18,6 +13,7 @@ import type {
|
|
|
18
13
|
} from "./types";
|
|
19
14
|
|
|
20
15
|
import { RadioGroup } from "../Radio";
|
|
16
|
+
import { Button } from "../Button";
|
|
21
17
|
import { FilterPanel } from "./FilterPanel";
|
|
22
18
|
import { RadioRow, DataViewsSwitch } from "./PanelControls";
|
|
23
19
|
import { cn } from "../../utils/cn";
|
|
@@ -50,17 +46,9 @@ export type DataViewsConfigPanelProps = {
|
|
|
50
46
|
state?: "open" | "closed";
|
|
51
47
|
};
|
|
52
48
|
|
|
53
|
-
const DEFAULT_SAVED_VIEWS: SavedView[] = [
|
|
54
|
-
{ id: "default", label: "Default View" },
|
|
55
|
-
];
|
|
49
|
+
const DEFAULT_SAVED_VIEWS: SavedView[] = [{ id: "default", label: "Default View" }];
|
|
56
50
|
|
|
57
|
-
function SectionHeader({
|
|
58
|
-
title,
|
|
59
|
-
action,
|
|
60
|
-
}: {
|
|
61
|
-
title: string;
|
|
62
|
-
action?: React.ReactNode;
|
|
63
|
-
}) {
|
|
51
|
+
function SectionHeader({ title, action }: { title: string; action?: React.ReactNode }) {
|
|
64
52
|
return (
|
|
65
53
|
<div className="flex items-center justify-between">
|
|
66
54
|
<h3 className="text-[18px] font-[510] leading-[1.32] tracking-[-0.01em] text-white">
|
|
@@ -86,9 +74,7 @@ function GripDots() {
|
|
|
86
74
|
fill="currentColor"
|
|
87
75
|
>
|
|
88
76
|
{[5.33, 9.33].flatMap((cx) =>
|
|
89
|
-
[3.33, 8, 12.67].map((cy) =>
|
|
90
|
-
<circle key={`${cx}-${cy}`} cx={cx} cy={cy} r="1" />
|
|
91
|
-
)),
|
|
77
|
+
[3.33, 8, 12.67].map((cy) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r="1" />),
|
|
92
78
|
)}
|
|
93
79
|
</svg>
|
|
94
80
|
);
|
|
@@ -126,23 +112,15 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
126
112
|
// `onSavedViewChange` are supplied; otherwise fall back to local state so the
|
|
127
113
|
// radios are still interactive (DataViewsLayout doesn't thread these props
|
|
128
114
|
// yet — without this the selection would snap back every click).
|
|
129
|
-
const [internalSavedView, setInternalSavedView] = useState(
|
|
130
|
-
() => savedViews[0]?.id,
|
|
131
|
-
);
|
|
115
|
+
const [internalSavedView, setInternalSavedView] = useState(() => savedViews[0]?.id);
|
|
132
116
|
const selectedSavedView = activeSavedView ?? internalSavedView;
|
|
133
117
|
const handleSavedViewChange = (id: string) => {
|
|
134
118
|
if (onSavedViewChange) onSavedViewChange(id);
|
|
135
119
|
else setInternalSavedView(id);
|
|
136
120
|
};
|
|
137
121
|
|
|
138
|
-
const visibleFields = useMemo(
|
|
139
|
-
|
|
140
|
-
[fields],
|
|
141
|
-
);
|
|
142
|
-
const visiblePaths = useMemo(
|
|
143
|
-
() => new Set(visibleFields.map((f) => f.path)),
|
|
144
|
-
[visibleFields],
|
|
145
|
-
);
|
|
122
|
+
const visibleFields = useMemo(() => fields.filter((f) => f.type !== "hidden"), [fields]);
|
|
123
|
+
const visiblePaths = useMemo(() => new Set(visibleFields.map((f) => f.path)), [visibleFields]);
|
|
146
124
|
const fieldByPath = useMemo(
|
|
147
125
|
() => new Map(visibleFields.map((f) => [f.path, f])),
|
|
148
126
|
[visibleFields],
|
|
@@ -234,7 +212,7 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
234
212
|
type="button"
|
|
235
213
|
onClick={onClose}
|
|
236
214
|
aria-label="Close panel"
|
|
237
|
-
className="flex h-7 w-7 items-center justify-center rounded-[8px] bg-white/[0.15] text-white transition-colors hover:bg-white
|
|
215
|
+
className="flex h-7 w-7 items-center justify-center rounded-[8px] bg-white/[0.15] text-white transition-colors hover:bg-background-presentation-state-negative-primary hover:text-white"
|
|
238
216
|
>
|
|
239
217
|
<X className="h-[18px] w-[18px]" />
|
|
240
218
|
</button>
|
|
@@ -262,14 +240,16 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
262
240
|
</div>
|
|
263
241
|
))}
|
|
264
242
|
</RadioGroup>
|
|
265
|
-
<
|
|
243
|
+
<Button
|
|
266
244
|
type="button"
|
|
245
|
+
variant="BorderStyle"
|
|
246
|
+
size="M"
|
|
267
247
|
onClick={onSaveNewView}
|
|
268
|
-
className="
|
|
248
|
+
className="w-full"
|
|
269
249
|
>
|
|
270
|
-
<Plus className="h-
|
|
250
|
+
<Plus className="h-4 w-4" />
|
|
271
251
|
Save a New View
|
|
272
|
-
</
|
|
252
|
+
</Button>
|
|
273
253
|
</div>
|
|
274
254
|
|
|
275
255
|
<div className="h-px w-full bg-[#2C2D2E]" />
|
|
@@ -277,9 +257,6 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
277
257
|
{/* Table Columns */}
|
|
278
258
|
<div className="space-y-3">
|
|
279
259
|
<SectionHeader title="Table Columns" />
|
|
280
|
-
<p className="text-[12px] leading-[1.475] text-content-presentation-global-tertiary">
|
|
281
|
-
Show or hide columns in table view
|
|
282
|
-
</p>
|
|
283
260
|
{orderedColumns.length === 0 ? (
|
|
284
261
|
<p className="text-xs text-content-presentation-global-tertiary">
|
|
285
262
|
No fields detected.
|
|
@@ -307,10 +284,8 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
307
284
|
onDragOver={(e) => {
|
|
308
285
|
e.preventDefault();
|
|
309
286
|
e.dataTransfer.dropEffect = "move";
|
|
310
|
-
const rect =
|
|
311
|
-
|
|
312
|
-
const before =
|
|
313
|
-
e.clientY < rect.top + rect.height / 2;
|
|
287
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
288
|
+
const before = e.clientY < rect.top + rect.height / 2;
|
|
314
289
|
const slot = before ? index : index + 1;
|
|
315
290
|
if (dropSlot !== slot) setDropSlot(slot);
|
|
316
291
|
}}
|
|
@@ -342,9 +317,7 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
342
317
|
<span className="flex shrink-0 items-center">
|
|
343
318
|
<DataViewsSwitch
|
|
344
319
|
checked={col.visible}
|
|
345
|
-
onCheckedChange={() =>
|
|
346
|
-
toggleColumnVisibility(col.id)
|
|
347
|
-
}
|
|
320
|
+
onCheckedChange={() => toggleColumnVisibility(col.id)}
|
|
348
321
|
/>
|
|
349
322
|
</span>
|
|
350
323
|
</div>
|
|
@@ -353,9 +326,7 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
353
326
|
})}
|
|
354
327
|
{/* Drop-at-end indicator: only ever rendered when the slot
|
|
355
328
|
points past the last row, so still exactly one line. */}
|
|
356
|
-
{dropSlot === orderedColumns.length && dragPath &&
|
|
357
|
-
<DropLine />
|
|
358
|
-
)}
|
|
329
|
+
{dropSlot === orderedColumns.length && dragPath && <DropLine />}
|
|
359
330
|
</div>
|
|
360
331
|
)}
|
|
361
332
|
</div>
|
|
@@ -394,13 +365,8 @@ export function DataViewsConfigPanel(props: DataViewsConfigPanelProps) {
|
|
|
394
365
|
<div key={col.id}>
|
|
395
366
|
{/* Edge-to-edge divider (Figma: no horizontal
|
|
396
367
|
inset). */}
|
|
397
|
-
{i > 0 &&
|
|
398
|
-
|
|
399
|
-
)}
|
|
400
|
-
<RadioRow
|
|
401
|
-
value={col.id}
|
|
402
|
-
label={col.label || field?.label || col.id}
|
|
403
|
-
/>
|
|
368
|
+
{i > 0 && <div className="dv-divider h-px bg-[#2C2D2E]" />}
|
|
369
|
+
<RadioRow value={col.id} label={col.label || field?.label || col.id} />
|
|
404
370
|
</div>
|
|
405
371
|
);
|
|
406
372
|
})}
|
|
@@ -57,9 +57,7 @@ export function DataViewsHeader({
|
|
|
57
57
|
>
|
|
58
58
|
{/* Title pill */}
|
|
59
59
|
<div className="flex h-9 shrink-0 items-center gap-2 rounded-[12px] border border-[#434446] bg-[#252729] px-[10px]">
|
|
60
|
-
<span className="text-[28px] font-[510] uppercase leading-[1.19] text-white">
|
|
61
|
-
{title}
|
|
62
|
-
</span>
|
|
60
|
+
<span className="text-[28px] font-[510] uppercase leading-[1.19] text-white">{title}</span>
|
|
63
61
|
</div>
|
|
64
62
|
|
|
65
63
|
{/* Divider */}
|