@stratum-hq/react 0.2.0 → 0.2.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.
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* DraggableTenantTree — TenantTree with drag-and-drop
|
|
2
|
+
* DraggableTenantTree — TenantTree with drag-and-drop support.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Supports two operations:
|
|
5
|
+
* - **Reparenting**: drag a tenant onto a different parent → calls moveTenant API
|
|
6
|
+
* - **Sibling reordering**: drag a tenant above/below a sibling → calls reorderTenant API
|
|
7
|
+
*
|
|
8
|
+
* Uses a dedicated drag handle (⠿) so clicking the node still selects it
|
|
9
|
+
* and clicking the expand/collapse arrow still works.
|
|
7
10
|
*
|
|
8
11
|
* ┌──────────────────────────────────┐
|
|
9
|
-
* │ AcmeSec
|
|
10
|
-
* │ ├── NorthStar MSP
|
|
11
|
-
* │ │ ├── Client Alpha
|
|
12
|
-
* │ │ └── Client Beta
|
|
13
|
-
* │ └── SouthShield MSP
|
|
14
|
-
* │
|
|
12
|
+
* │ ⠿ AcmeSec │
|
|
13
|
+
* │ ⠿ ├── NorthStar MSP │
|
|
14
|
+
* │ ⠿ │ ├── Client Alpha ← drag │
|
|
15
|
+
* │ ⠿ │ └── Client Beta │
|
|
16
|
+
* │ ⠿ └── SouthShield MSP ← drop │
|
|
17
|
+
* │ ⠿ └── Client Gamma │
|
|
15
18
|
* └──────────────────────────────────┘
|
|
16
19
|
*/
|
|
17
20
|
export interface DraggableTenantTreeProps {
|
|
18
21
|
rootId?: string;
|
|
19
22
|
onSelect?: (tenantId: string) => void;
|
|
20
23
|
onMove?: (tenantId: string, newParentId: string) => void;
|
|
24
|
+
onReorder?: (tenantId: string, position: number) => void;
|
|
25
|
+
onEdit?: (tenantId: string, currentName: string) => void;
|
|
26
|
+
onArchive?: (tenantId: string, name: string) => void;
|
|
27
|
+
onAddChild?: (parentId: string) => void;
|
|
21
28
|
className?: string;
|
|
22
29
|
}
|
|
23
|
-
export declare function DraggableTenantTree({ rootId, onSelect, onMove, className, }: DraggableTenantTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export declare function DraggableTenantTree({ rootId, onSelect, onMove, onReorder, onEdit, onArchive, onAddChild, className, }: DraggableTenantTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
24
31
|
//# sourceMappingURL=DraggableTenantTree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraggableTenantTree.d.ts","sourceRoot":"","sources":["../../src/components/DraggableTenantTree.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"DraggableTenantTree.d.ts","sourceRoot":"","sources":["../../src/components/DraggableTenantTree.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAkBH,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsJD,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,MAAM,EACN,SAAS,EACT,UAAU,EACV,SAAS,GACV,EAAE,wBAAwB,2CAyI1B"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* DraggableTenantTree — TenantTree with drag-and-drop
|
|
3
|
+
* DraggableTenantTree — TenantTree with drag-and-drop support.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Supports two operations:
|
|
6
|
+
* - **Reparenting**: drag a tenant onto a different parent → calls moveTenant API
|
|
7
|
+
* - **Sibling reordering**: drag a tenant above/below a sibling → calls reorderTenant API
|
|
8
|
+
*
|
|
9
|
+
* Uses a dedicated drag handle (⠿) so clicking the node still selects it
|
|
10
|
+
* and clicking the expand/collapse arrow still works.
|
|
8
11
|
*
|
|
9
12
|
* ┌──────────────────────────────────┐
|
|
10
|
-
* │ AcmeSec
|
|
11
|
-
* │ ├── NorthStar MSP
|
|
12
|
-
* │ │ ├── Client Alpha
|
|
13
|
-
* │ │ └── Client Beta
|
|
14
|
-
* │ └── SouthShield MSP
|
|
15
|
-
* │
|
|
13
|
+
* │ ⠿ AcmeSec │
|
|
14
|
+
* │ ⠿ ├── NorthStar MSP │
|
|
15
|
+
* │ ⠿ │ ├── Client Alpha ← drag │
|
|
16
|
+
* │ ⠿ │ └── Client Beta │
|
|
17
|
+
* │ ⠿ └── SouthShield MSP ← drop │
|
|
18
|
+
* │ ⠿ └── Client Gamma │
|
|
16
19
|
* └──────────────────────────────────┘
|
|
17
20
|
*/
|
|
18
21
|
import { useState, useCallback } from "react";
|
|
@@ -22,7 +25,7 @@ import { useTenant } from "../hooks/use-tenant.js";
|
|
|
22
25
|
import { useStratum } from "../provider.js";
|
|
23
26
|
import { useMessages } from "../hooks/use-messages.js";
|
|
24
27
|
// ── Draggable + Droppable node ──────────────────────────────
|
|
25
|
-
function DraggableTreeNode({ node, selectedId, onSelect, onToggle, depth, t, }) {
|
|
28
|
+
function DraggableTreeNode({ node, selectedId, onSelect, onToggle, onEdit, onArchive, onAddChild, depth, t, }) {
|
|
26
29
|
const hasChildren = node.children.length > 0;
|
|
27
30
|
const { attributes, listeners, setNodeRef: setDragRef, isDragging } = useDraggable({
|
|
28
31
|
id: node.id,
|
|
@@ -32,22 +35,18 @@ function DraggableTreeNode({ node, selectedId, onSelect, onToggle, depth, t, })
|
|
|
32
35
|
id: `drop-${node.id}`,
|
|
33
36
|
data: { node },
|
|
34
37
|
});
|
|
35
|
-
return (_jsxs("li", { role: "treeitem", "aria-expanded": hasChildren ? node.expanded : undefined, children: [_jsxs("div", { ref:
|
|
38
|
+
return (_jsxs("li", { role: "treeitem", "aria-expanded": hasChildren ? node.expanded : undefined, children: [_jsxs("div", { ref: setDropRef, className: [
|
|
36
39
|
"stratum-tree__node",
|
|
37
40
|
selectedId === node.id ? "stratum-tree__node--selected" : "",
|
|
38
41
|
isDragging ? "stratum-tree__node--dragging" : "",
|
|
39
42
|
isOver ? "stratum-tree__node--drop-target" : "",
|
|
40
43
|
].filter(Boolean).join(" "), style: {
|
|
41
|
-
paddingInlineStart: `calc(${depth} * var(--space-xl) + var(--space-sm))`,
|
|
44
|
+
paddingInlineStart: `calc(${depth} * var(--space-xl, 24px) + var(--space-sm, 8px))`,
|
|
42
45
|
opacity: isDragging ? 0.4 : 1,
|
|
43
|
-
}, ...attributes, ...listeners, children:
|
|
44
|
-
}
|
|
45
|
-
// ── Drag overlay (ghost element shown while dragging) ────────
|
|
46
|
-
function DragOverlayContent({ node }) {
|
|
47
|
-
return (_jsx("div", { className: "stratum-tree__drag-overlay", children: node.name }));
|
|
46
|
+
}, children: [_jsx("span", { ref: setDragRef, ...attributes, ...listeners, className: "stratum-tree__drag-handle", title: "Drag to reparent or reorder", onClick: (e) => e.stopPropagation(), children: "\u283F" }), hasChildren ? (_jsx("button", { type: "button", className: "stratum-tree__toggle", onClick: (e) => { e.stopPropagation(); onToggle(node.id); }, "aria-label": node.expanded ? t("tenantTree.collapse") : t("tenantTree.expand"), children: node.expanded ? "\u25BC" : "\u25B6" })) : (_jsx("span", { className: "stratum-tree__spacer", children: " " })), _jsx("span", { className: "stratum-tree__label", onClick: () => onSelect?.(node.id), onKeyDown: (e) => e.key === "Enter" && onSelect?.(node.id), tabIndex: 0, role: "button", children: node.name }), _jsx("span", { className: "stratum-tree__badge", children: t("tenantTree.badgeRls") }), _jsx("span", { className: "stratum-tree__meta", children: node.status === "archived" ? t("tenantTree.archived") : "" }), (onEdit || onArchive || onAddChild) && (_jsxs("span", { className: "stratum-tree__actions", children: [onEdit && (_jsx("button", { type: "button", className: "stratum-tree__action-btn", onClick: (e) => { e.stopPropagation(); onEdit(node.id, node.name); }, title: "Edit tenant", children: "\u270E" })), onAddChild && (_jsx("button", { type: "button", className: "stratum-tree__action-btn", onClick: (e) => { e.stopPropagation(); onAddChild(node.id); }, title: "Add child tenant", children: "+" })), onArchive && !hasChildren && (_jsx("button", { type: "button", className: "stratum-tree__action-btn stratum-tree__action-btn--danger", onClick: (e) => { e.stopPropagation(); onArchive(node.id, node.name); }, title: "Archive tenant", children: "\u00D7" }))] }))] }), hasChildren && node.expanded && (_jsx("ul", { role: "group", children: node.children.map((child) => (_jsx(DraggableTreeNode, { node: child, selectedId: selectedId, onSelect: onSelect, onToggle: onToggle, onEdit: onEdit, onArchive: onArchive, onAddChild: onAddChild, depth: depth + 1, t: t }, child.id))) }))] }));
|
|
48
47
|
}
|
|
49
48
|
// ── Main component ──────────────────────────────────────────
|
|
50
|
-
export function DraggableTenantTree({ rootId, onSelect, onMove, className, }) {
|
|
49
|
+
export function DraggableTenantTree({ rootId, onSelect, onMove, onReorder, onEdit, onArchive, onAddChild, className, }) {
|
|
51
50
|
const { tree, loading, error, toggleExpand, refresh } = useTenantTree(rootId);
|
|
52
51
|
const { tenant } = useTenant();
|
|
53
52
|
const { apiCall, toast } = useStratum();
|
|
@@ -64,6 +63,13 @@ export function DraggableTenantTree({ rootId, onSelect, onMove, className, }) {
|
|
|
64
63
|
}
|
|
65
64
|
return null;
|
|
66
65
|
}, [tree]);
|
|
66
|
+
// Find siblings of a node (nodes with same parent_id)
|
|
67
|
+
const findSiblings = useCallback((parentId, nodes = tree) => {
|
|
68
|
+
if (!parentId)
|
|
69
|
+
return tree; // root-level siblings
|
|
70
|
+
const parent = findNode(parentId);
|
|
71
|
+
return parent ? parent.children : [];
|
|
72
|
+
}, [tree, findNode]);
|
|
67
73
|
const handleDragStart = (event) => {
|
|
68
74
|
const node = event.active.data.current?.node;
|
|
69
75
|
setActiveNode(node ?? null);
|
|
@@ -74,13 +80,12 @@ export function DraggableTenantTree({ rootId, onSelect, onMove, className, }) {
|
|
|
74
80
|
if (!over)
|
|
75
81
|
return;
|
|
76
82
|
const draggedId = active.id;
|
|
77
|
-
// Drop target IDs are prefixed with "drop-"
|
|
78
83
|
const targetId = over.id.replace(/^drop-/, "");
|
|
79
|
-
// Don't drop on self or current parent
|
|
80
84
|
if (draggedId === targetId)
|
|
81
85
|
return;
|
|
82
86
|
const draggedNode = findNode(draggedId);
|
|
83
|
-
|
|
87
|
+
const targetNode = findNode(targetId);
|
|
88
|
+
if (!draggedNode || !targetNode)
|
|
84
89
|
return;
|
|
85
90
|
// Check: don't drop a parent onto its own descendant (cycle)
|
|
86
91
|
const isDescendant = (parentNode, childId) => {
|
|
@@ -96,25 +101,43 @@ export function DraggableTenantTree({ rootId, onSelect, onMove, className, }) {
|
|
|
96
101
|
toast.error("Cannot move a tenant under its own descendant");
|
|
97
102
|
return;
|
|
98
103
|
}
|
|
104
|
+
// Determine operation: reorder (same parent) or reparent (different parent)
|
|
105
|
+
const sameParent = draggedNode.parent_id === targetNode.parent_id;
|
|
99
106
|
try {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
if (sameParent) {
|
|
108
|
+
// Sibling reorder — find target's position and place dragged there
|
|
109
|
+
const siblings = findSiblings(targetNode.parent_id);
|
|
110
|
+
const targetIndex = siblings.findIndex((s) => s.id === targetId);
|
|
111
|
+
const position = Math.max(0, targetIndex);
|
|
112
|
+
await apiCall(`/api/v1/tenants/${draggedId}/reorder`, {
|
|
113
|
+
method: "POST",
|
|
114
|
+
headers: { "Content-Type": "application/json" },
|
|
115
|
+
body: JSON.stringify({ position }),
|
|
116
|
+
});
|
|
117
|
+
toast.success(`Reordered "${draggedNode.name}"`);
|
|
118
|
+
onReorder?.(draggedId, position);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Reparent — move to target as new parent
|
|
122
|
+
await apiCall(`/api/v1/tenants/${draggedId}/move`, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: { "Content-Type": "application/json" },
|
|
125
|
+
body: JSON.stringify({ new_parent_id: targetId }),
|
|
126
|
+
});
|
|
127
|
+
toast.success(`Moved "${draggedNode.name}" under "${targetNode.name}"`);
|
|
128
|
+
onMove?.(draggedId, targetId);
|
|
129
|
+
}
|
|
107
130
|
await refresh();
|
|
108
131
|
}
|
|
109
132
|
catch (err) {
|
|
110
|
-
toast.error(`Failed
|
|
133
|
+
toast.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
111
134
|
}
|
|
112
135
|
};
|
|
113
136
|
if (loading)
|
|
114
137
|
return _jsx("div", { className: className, children: t("tenantTree.loading") });
|
|
115
138
|
if (error)
|
|
116
139
|
return _jsx("div", { className: className, children: t("tenantTree.error", { message: error.message }) });
|
|
117
|
-
return (_jsxs("div", { className: `stratum-tree stratum-tree--draggable ${className || ""}`, children: [_jsx("style", { children: draggableStyles }), _jsxs(DndContext, { collisionDetection: closestCenter, onDragStart: handleDragStart, onDragEnd: handleDragEnd, children: [_jsx("ul", { role: "tree", className: "stratum-tree__root", children: tree.map((node) => (_jsx(DraggableTreeNode, { node: node, selectedId: tenant?.id, onSelect: onSelect, onToggle: toggleExpand, depth: 0, t: t }, node.id))) }), _jsx(DragOverlay, { children: activeNode ? _jsx(
|
|
140
|
+
return (_jsxs("div", { className: `stratum-tree stratum-tree--draggable ${className || ""}`, children: [_jsx("style", { children: draggableStyles }), _jsxs(DndContext, { collisionDetection: closestCenter, onDragStart: handleDragStart, onDragEnd: handleDragEnd, children: [_jsx("ul", { role: "tree", className: "stratum-tree__root", children: tree.map((node) => (_jsx(DraggableTreeNode, { node: node, selectedId: tenant?.id, onSelect: onSelect, onToggle: toggleExpand, onEdit: onEdit, onArchive: onArchive, onAddChild: onAddChild, depth: 0, t: t }, node.id))) }), _jsx(DragOverlay, { children: activeNode ? (_jsx("div", { className: "stratum-tree__drag-overlay", children: activeNode.name })) : null })] })] }));
|
|
118
141
|
}
|
|
119
142
|
// ── Scoped styles ───────────────────────────────────────────
|
|
120
143
|
const draggableStyles = `
|
|
@@ -129,24 +152,63 @@ const draggableStyles = `
|
|
|
129
152
|
background: rgba(13, 148, 136, 0.08);
|
|
130
153
|
}
|
|
131
154
|
|
|
155
|
+
.stratum-tree__drag-handle {
|
|
156
|
+
width: 14px;
|
|
157
|
+
font-size: 10px;
|
|
158
|
+
color: var(--color-400, #94A3B8);
|
|
159
|
+
flex-shrink: 0;
|
|
160
|
+
cursor: grab;
|
|
161
|
+
line-height: 1;
|
|
162
|
+
touch-action: none;
|
|
163
|
+
user-select: none;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.stratum-tree__drag-handle:active {
|
|
167
|
+
cursor: grabbing;
|
|
168
|
+
}
|
|
169
|
+
|
|
132
170
|
.stratum-tree__drag-overlay {
|
|
133
|
-
padding:
|
|
171
|
+
padding: 6px 16px;
|
|
172
|
+
min-width: 140px;
|
|
134
173
|
background: var(--bg-card, white);
|
|
135
174
|
border: 1px solid var(--color-accent, #0D9488);
|
|
136
175
|
border-radius: var(--radius-sm, 4px);
|
|
137
|
-
box-shadow: var(--shadow-md);
|
|
176
|
+
box-shadow: var(--shadow-md, 0 2px 8px rgba(0,0,0,0.15));
|
|
138
177
|
font-size: 0.8125rem;
|
|
139
178
|
font-family: var(--font-body, 'DM Sans', system-ui, sans-serif);
|
|
140
179
|
color: var(--text-primary, #0F172A);
|
|
141
180
|
cursor: grabbing;
|
|
181
|
+
white-space: nowrap;
|
|
142
182
|
}
|
|
143
183
|
|
|
144
|
-
.stratum-
|
|
145
|
-
|
|
184
|
+
.stratum-tree__actions {
|
|
185
|
+
display: inline-flex;
|
|
186
|
+
gap: 2px;
|
|
187
|
+
margin-left: auto;
|
|
146
188
|
}
|
|
147
189
|
|
|
148
|
-
.stratum-
|
|
149
|
-
|
|
190
|
+
.stratum-tree__action-btn {
|
|
191
|
+
background: none;
|
|
192
|
+
border: none;
|
|
193
|
+
cursor: pointer;
|
|
194
|
+
font-size: 11px;
|
|
195
|
+
padding: 0 2px;
|
|
196
|
+
color: var(--color-400, #94A3B8);
|
|
197
|
+
line-height: 1;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.stratum-tree__action-btn:hover {
|
|
201
|
+
color: var(--text-primary, #0F172A);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.stratum-tree__action-btn--danger:hover {
|
|
205
|
+
color: var(--color-error, #DC2626);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
[data-theme="dark"] .stratum-tree__drag-overlay {
|
|
209
|
+
background: var(--color-800, #1E293B);
|
|
210
|
+
color: #e2e8f0;
|
|
211
|
+
box-shadow: 0 4px 16px rgba(0,0,0,0.3);
|
|
150
212
|
}
|
|
151
213
|
`;
|
|
152
214
|
//# sourceMappingURL=DraggableTenantTree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraggableTenantTree.js","sourceRoot":"","sources":["../../src/components/DraggableTenantTree.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"DraggableTenantTree.js","sourceRoot":"","sources":["../../src/components/DraggableTenantTree.tsx"],"names":[],"mappings":"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"}
|