@issonujha/sdui-core 0.0.0-stage → 0.1.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/dist/buildNavTree.d.ts +8 -0
- package/dist/buildNavTree.d.ts.map +1 -0
- package/dist/buildNavTree.js +65 -0
- package/dist/buildNavTree.js.map +1 -0
- package/dist/contracts.d.ts +124 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +6 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/moveNode.d.ts +15 -0
- package/dist/moveNode.d.ts.map +1 -0
- package/dist/moveNode.js +52 -0
- package/dist/moveNode.js.map +1 -0
- package/dist/roles.d.ts +15 -0
- package/dist/roles.d.ts.map +1 -0
- package/dist/roles.js +27 -0
- package/dist/roles.js.map +1 -0
- package/dist/useTreeDragDrop.d.ts +20 -0
- package/dist/useTreeDragDrop.d.ts.map +1 -0
- package/dist/useTreeDragDrop.js +31 -0
- package/dist/useTreeDragDrop.js.map +1 -0
- package/package.json +30 -3
- package/README.md +0 -3
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NavigationItem } from './contracts.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a nested navigation tree from a flat list. Mirrors the backend
|
|
4
|
+
* TreeHierarchyEngine: duplicate ids throw, orphans are promoted to roots,
|
|
5
|
+
* true cycles throw.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildNavTree(flatItems: NavigationItem[]): NavigationItem[];
|
|
8
|
+
//# sourceMappingURL=buildNavTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildNavTree.d.ts","sourceRoot":"","sources":["../src/buildNavTree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CA4D1E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a nested navigation tree from a flat list. Mirrors the backend
|
|
3
|
+
* TreeHierarchyEngine: duplicate ids throw, orphans are promoted to roots,
|
|
4
|
+
* true cycles throw.
|
|
5
|
+
*/
|
|
6
|
+
export function buildNavTree(flatItems) {
|
|
7
|
+
if (!flatItems || flatItems.length === 0)
|
|
8
|
+
return [];
|
|
9
|
+
const byId = new Map();
|
|
10
|
+
for (const item of flatItems) {
|
|
11
|
+
if (byId.has(item.id))
|
|
12
|
+
throw new Error(`Duplicate node id: ${item.id}`);
|
|
13
|
+
byId.set(item.id, { ...item, children: [] });
|
|
14
|
+
}
|
|
15
|
+
const roots = [];
|
|
16
|
+
const childrenByParent = new Map();
|
|
17
|
+
for (const item of flatItems) {
|
|
18
|
+
const node = byId.get(item.id);
|
|
19
|
+
const parentId = item.parentId ?? null;
|
|
20
|
+
if (parentId === null || !byId.has(parentId)) {
|
|
21
|
+
roots.push(node);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const siblings = childrenByParent.get(parentId) ?? [];
|
|
25
|
+
siblings.push(node);
|
|
26
|
+
childrenByParent.set(parentId, siblings);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const sortAndLink = (nodes) => {
|
|
30
|
+
nodes.sort((a, b) => a.order - b.order);
|
|
31
|
+
for (const node of nodes) {
|
|
32
|
+
const children = childrenByParent.get(node.id) ?? [];
|
|
33
|
+
node.children = children;
|
|
34
|
+
sortAndLink(children);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
sortAndLink(roots);
|
|
38
|
+
const reachable = new Set();
|
|
39
|
+
const visit = (nodes) => {
|
|
40
|
+
for (const node of nodes) {
|
|
41
|
+
if (reachable.has(node.id))
|
|
42
|
+
continue;
|
|
43
|
+
reachable.add(node.id);
|
|
44
|
+
visit(node.children ?? []);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
visit(roots);
|
|
48
|
+
if (reachable.size < byId.size) {
|
|
49
|
+
for (const id of byId.keys()) {
|
|
50
|
+
if (reachable.has(id))
|
|
51
|
+
continue;
|
|
52
|
+
const path = new Set();
|
|
53
|
+
let cursor = id;
|
|
54
|
+
while (cursor !== null && !path.has(cursor)) {
|
|
55
|
+
path.add(cursor);
|
|
56
|
+
cursor = byId.get(cursor)?.parentId ?? null;
|
|
57
|
+
}
|
|
58
|
+
if (cursor !== null) {
|
|
59
|
+
throw new Error(`Circular hierarchy cycle detected involving node: ${id}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return roots;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=buildNavTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildNavTree.js","sourceRoot":"","sources":["../src/buildNavTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal SDUI contracts. These are field-compatible supersets of rn-backend's
|
|
3
|
+
* current JSON wire format. The canonical pagination flag is `last` (not `isLast`).
|
|
4
|
+
*/
|
|
5
|
+
export type ColumnType = 'text' | 'money' | 'badge' | 'number' | 'date' | 'link' | 'custom';
|
|
6
|
+
export interface ColumnDef<T = Record<string, unknown>> {
|
|
7
|
+
key: string;
|
|
8
|
+
label: string;
|
|
9
|
+
type?: ColumnType;
|
|
10
|
+
sortable?: boolean;
|
|
11
|
+
filterable?: boolean;
|
|
12
|
+
align?: 'left' | 'center' | 'right';
|
|
13
|
+
width?: number | string;
|
|
14
|
+
currency?: string;
|
|
15
|
+
badgeColorMap?: Record<string, string>;
|
|
16
|
+
actions?: TableAction<T>[];
|
|
17
|
+
/** Roles permitted to view this column. Empty/undefined = visible to all. */
|
|
18
|
+
rolesAllowed?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface TableAction<T = Record<string, unknown>> {
|
|
21
|
+
key: string;
|
|
22
|
+
label: string;
|
|
23
|
+
icon?: string;
|
|
24
|
+
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
25
|
+
endpoint?: string | ((row: T) => string);
|
|
26
|
+
confirmText?: string;
|
|
27
|
+
}
|
|
28
|
+
export type FilterType = 'SELECT' | 'MULTI_SELECT' | 'FACET' | 'LOOKUP' | 'DATE_RANGE' | 'SEARCH' | 'BOOLEAN';
|
|
29
|
+
export interface FilterOption {
|
|
30
|
+
label: string;
|
|
31
|
+
value: string | number | boolean | null;
|
|
32
|
+
count?: number | null;
|
|
33
|
+
}
|
|
34
|
+
export interface FilterDef {
|
|
35
|
+
key: string;
|
|
36
|
+
label: string;
|
|
37
|
+
type: FilterType;
|
|
38
|
+
placeholder?: string;
|
|
39
|
+
options?: FilterOption[];
|
|
40
|
+
defaultValue?: unknown;
|
|
41
|
+
/** LOOKUP: registry key resolved by the host lookup service. */
|
|
42
|
+
entityKey?: string;
|
|
43
|
+
minChars?: number;
|
|
44
|
+
/** LOOKUP / MULTI_SELECT. */
|
|
45
|
+
multiple?: boolean;
|
|
46
|
+
/** FACET: facet key resolved when options are empty. */
|
|
47
|
+
facetKey?: string;
|
|
48
|
+
/** Column this filter binds to. */
|
|
49
|
+
columnKey?: string;
|
|
50
|
+
/** Roles permitted to see/interact with this dimension. */
|
|
51
|
+
rolesAllowed?: string[];
|
|
52
|
+
/** Cascading parent filter key. */
|
|
53
|
+
dependsOn?: string;
|
|
54
|
+
/** Remote endpoint for dynamic options (executed by the host fetcher). */
|
|
55
|
+
optionsEndpoint?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface DataTableResponse<T> {
|
|
58
|
+
content: T[];
|
|
59
|
+
totalElements: number;
|
|
60
|
+
totalPages: number;
|
|
61
|
+
pageNumber: number;
|
|
62
|
+
pageSize: number;
|
|
63
|
+
/** Wire field is `last` (matches rn-backend), never `isLast`. */
|
|
64
|
+
last: boolean;
|
|
65
|
+
columns: ColumnDef<T>[];
|
|
66
|
+
filters: FilterDef[];
|
|
67
|
+
sortBy?: string;
|
|
68
|
+
sortDir?: 'asc' | 'desc' | 'ASC' | 'DESC';
|
|
69
|
+
summary?: Record<string, unknown>;
|
|
70
|
+
stages?: KanbanStageDef[];
|
|
71
|
+
enableLiveReload?: boolean;
|
|
72
|
+
defaultLiveReload?: number;
|
|
73
|
+
enableExport?: boolean;
|
|
74
|
+
enableColumnVisibility?: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface DataTableRequest {
|
|
77
|
+
page?: number;
|
|
78
|
+
size?: number;
|
|
79
|
+
sortBy?: string;
|
|
80
|
+
sortDir?: 'ASC' | 'DESC';
|
|
81
|
+
search?: string;
|
|
82
|
+
filters?: Record<string, unknown>;
|
|
83
|
+
}
|
|
84
|
+
export interface NavigationItem {
|
|
85
|
+
id: string;
|
|
86
|
+
code: string;
|
|
87
|
+
label: string;
|
|
88
|
+
route: string;
|
|
89
|
+
icon?: string;
|
|
90
|
+
order: number;
|
|
91
|
+
parentId?: string | null;
|
|
92
|
+
type?: 'LINK' | 'GROUP' | 'DIVIDER';
|
|
93
|
+
visible?: boolean;
|
|
94
|
+
requiredRoles?: string[];
|
|
95
|
+
exactMatch?: boolean;
|
|
96
|
+
group?: string;
|
|
97
|
+
children?: NavigationItem[];
|
|
98
|
+
}
|
|
99
|
+
export interface PlatformFilter {
|
|
100
|
+
key: string;
|
|
101
|
+
label: string;
|
|
102
|
+
type: FilterType;
|
|
103
|
+
options?: FilterOption[];
|
|
104
|
+
defaultValue?: unknown;
|
|
105
|
+
entityKey?: string;
|
|
106
|
+
multiple?: boolean;
|
|
107
|
+
}
|
|
108
|
+
export type TableViewMode = 'table' | 'kanban' | 'cards' | 'list';
|
|
109
|
+
export interface KanbanStageDef {
|
|
110
|
+
key: string;
|
|
111
|
+
label: string;
|
|
112
|
+
color?: string;
|
|
113
|
+
textColor?: string;
|
|
114
|
+
borderColor?: string;
|
|
115
|
+
statuses?: string[];
|
|
116
|
+
}
|
|
117
|
+
export interface StageTransitionOption {
|
|
118
|
+
id: string;
|
|
119
|
+
name: string;
|
|
120
|
+
code: string;
|
|
121
|
+
requiresOtp?: boolean;
|
|
122
|
+
primary?: boolean;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NavigationItem } from './contracts.js';
|
|
2
|
+
export interface NodeDelta {
|
|
3
|
+
id: string;
|
|
4
|
+
parentId: string | null;
|
|
5
|
+
order: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Pure, framework-free reorder: moves `draggedId` relative to `targetId` and returns
|
|
9
|
+
* both the new tree and the deltas the host should persist. Contains no network I/O.
|
|
10
|
+
*/
|
|
11
|
+
export declare function moveNode(roots: NavigationItem[], draggedId: string, targetId: string, placement: 'before' | 'after' | 'inside'): {
|
|
12
|
+
tree: NavigationItem[];
|
|
13
|
+
deltas: NodeDelta[];
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=moveNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moveNode.d.ts","sourceRoot":"","sources":["../src/moveNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,cAAc,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GACvC;IAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CA+CjD"}
|
package/dist/moveNode.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, framework-free reorder: moves `draggedId` relative to `targetId` and returns
|
|
3
|
+
* both the new tree and the deltas the host should persist. Contains no network I/O.
|
|
4
|
+
*/
|
|
5
|
+
export function moveNode(roots, draggedId, targetId, placement) {
|
|
6
|
+
const deltas = [];
|
|
7
|
+
const clone = (nodes) => nodes.map((n) => ({ ...n, children: n.children ? clone(n.children) : undefined }));
|
|
8
|
+
const detach = (nodes, id) => {
|
|
9
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
10
|
+
if (nodes[i].id === id)
|
|
11
|
+
return nodes.splice(i, 1)[0];
|
|
12
|
+
const found = nodes[i].children ? detach(nodes[i].children, id) : null;
|
|
13
|
+
if (found)
|
|
14
|
+
return found;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
};
|
|
18
|
+
const next = clone(roots);
|
|
19
|
+
const dragged = detach(next, draggedId);
|
|
20
|
+
if (!dragged || draggedId === targetId)
|
|
21
|
+
return { tree: roots, deltas: [] };
|
|
22
|
+
const insertInto = (nodes) => {
|
|
23
|
+
for (const node of nodes) {
|
|
24
|
+
if (node.id === targetId) {
|
|
25
|
+
node.children = node.children ?? [];
|
|
26
|
+
if (placement === 'inside') {
|
|
27
|
+
node.children.push(dragged);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const idx = placement === 'before' ? 0 : node.children.length;
|
|
31
|
+
node.children.splice(idx, 0, dragged);
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (node.children && insertInto(node.children))
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
};
|
|
40
|
+
if (!insertInto(next))
|
|
41
|
+
return { tree: roots, deltas: [] };
|
|
42
|
+
const walk = (nodes, parentId) => {
|
|
43
|
+
nodes.forEach((n, i) => {
|
|
44
|
+
deltas.push({ id: n.id, parentId, order: i });
|
|
45
|
+
if (n.children?.length)
|
|
46
|
+
walk(n.children, n.id);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
walk(next, null);
|
|
50
|
+
return { tree: next, deltas };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=moveNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moveNode.js","sourceRoot":"","sources":["../src/moveNode.ts"],"names":[],"mappings":"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"}
|
package/dist/roles.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role-aware visibility helpers. These are the glue between the auth-service token
|
|
3
|
+
* roles/permissions and what a project's UI shows.
|
|
4
|
+
*/
|
|
5
|
+
/** True when `rolesAllowed` is empty/undefined, or the user holds one of them. */
|
|
6
|
+
export declare function isVisibleForRoles(rolesAllowed: string[] | undefined, userRoles: string[]): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Recursively filters a navigation tree to items the user may see. A group with no
|
|
9
|
+
* visible children is itself dropped.
|
|
10
|
+
*/
|
|
11
|
+
export declare function filterNavByRoles<T extends {
|
|
12
|
+
requiredRoles?: string[];
|
|
13
|
+
children?: T[];
|
|
14
|
+
}>(items: T[], userRoles: string[]): T[];
|
|
15
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAGlG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAA;CAAE,EACrF,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,MAAM,EAAE,GAClB,CAAC,EAAE,CASL"}
|
package/dist/roles.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role-aware visibility helpers. These are the glue between the auth-service token
|
|
3
|
+
* roles/permissions and what a project's UI shows.
|
|
4
|
+
*/
|
|
5
|
+
/** True when `rolesAllowed` is empty/undefined, or the user holds one of them. */
|
|
6
|
+
export function isVisibleForRoles(rolesAllowed, userRoles) {
|
|
7
|
+
if (!rolesAllowed || rolesAllowed.length === 0)
|
|
8
|
+
return true;
|
|
9
|
+
return rolesAllowed.some((role) => userRoles.includes(role));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Recursively filters a navigation tree to items the user may see. A group with no
|
|
13
|
+
* visible children is itself dropped.
|
|
14
|
+
*/
|
|
15
|
+
export function filterNavByRoles(items, userRoles) {
|
|
16
|
+
const result = [];
|
|
17
|
+
for (const item of items) {
|
|
18
|
+
if (!isVisibleForRoles(item.requiredRoles, userRoles))
|
|
19
|
+
continue;
|
|
20
|
+
const children = item.children ? filterNavByRoles(item.children, userRoles) : undefined;
|
|
21
|
+
if (item.children && item.children.length > 0 && (!children || children.length === 0))
|
|
22
|
+
continue;
|
|
23
|
+
result.push(children ? { ...item, children } : { ...item });
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,YAAkC,EAAE,SAAmB;IACvF,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAU,EACV,SAAmB;IAEnB,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;YAAE,SAAS;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;YAAE,SAAS;QAChG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NavigationItem } from './contracts.js';
|
|
2
|
+
import { type NodeDelta } from './moveNode.js';
|
|
3
|
+
export type DropPlacement = 'before' | 'after' | 'inside';
|
|
4
|
+
/**
|
|
5
|
+
* Headless drag-and-drop state for a navigation tree. Performs no network I/O: the
|
|
6
|
+
* host receives deltas via the callback passed to `onDrop`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useTreeDragDrop(initialItems: NavigationItem[]): {
|
|
9
|
+
items: NavigationItem[];
|
|
10
|
+
draggedId: string | null;
|
|
11
|
+
dropTarget: {
|
|
12
|
+
id: string;
|
|
13
|
+
placement: "before" | "after" | "inside";
|
|
14
|
+
} | null;
|
|
15
|
+
onDragStart: (id: string) => void;
|
|
16
|
+
onDragOver: (targetId: string, ratio: number, isGroup: boolean) => void;
|
|
17
|
+
onDrop: (onCommitDeltas: (deltas: NodeDelta[]) => void) => void;
|
|
18
|
+
setItems: import("react").Dispatch<import("react").SetStateAction<NavigationItem[]>>;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=useTreeDragDrop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreeDragDrop.d.ts","sourceRoot":"","sources":["../src/useTreeDragDrop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,cAAc,EAAE;;;;YAGT,MAAM;mBAAa,QAAQ,GAAG,OAAO,GAAG,QAAQ;;sBAI9D,MAAM;2BAG9B,MAAM,SAAS,MAAM,WAAW,OAAO;6BASjC,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI;;EAYjD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { moveNode } from './moveNode.js';
|
|
3
|
+
/**
|
|
4
|
+
* Headless drag-and-drop state for a navigation tree. Performs no network I/O: the
|
|
5
|
+
* host receives deltas via the callback passed to `onDrop`.
|
|
6
|
+
*/
|
|
7
|
+
export function useTreeDragDrop(initialItems) {
|
|
8
|
+
const [items, setItems] = useState(initialItems);
|
|
9
|
+
const [draggedId, setDraggedId] = useState(null);
|
|
10
|
+
const [dropTarget, setDropTarget] = useState(null);
|
|
11
|
+
const onDragStart = useCallback((id) => setDraggedId(id), []);
|
|
12
|
+
const onDragOver = useCallback((targetId, ratio, isGroup) => {
|
|
13
|
+
if (isGroup && ratio >= 0.3 && ratio <= 0.7)
|
|
14
|
+
setDropTarget({ id: targetId, placement: 'inside' });
|
|
15
|
+
else if (ratio < 0.5)
|
|
16
|
+
setDropTarget({ id: targetId, placement: 'before' });
|
|
17
|
+
else
|
|
18
|
+
setDropTarget({ id: targetId, placement: 'after' });
|
|
19
|
+
}, []);
|
|
20
|
+
const onDrop = useCallback((onCommitDeltas) => {
|
|
21
|
+
if (!draggedId || !dropTarget)
|
|
22
|
+
return;
|
|
23
|
+
const { tree, deltas } = moveNode(items, draggedId, dropTarget.id, dropTarget.placement);
|
|
24
|
+
setItems(tree);
|
|
25
|
+
setDraggedId(null);
|
|
26
|
+
setDropTarget(null);
|
|
27
|
+
onCommitDeltas(deltas); // host persists deltas; package performs no network I/O
|
|
28
|
+
}, [items, draggedId, dropTarget]);
|
|
29
|
+
return { items, draggedId, dropTarget, onDragStart, onDragOver, onDrop, setItems };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=useTreeDragDrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreeDragDrop.js","sourceRoot":"","sources":["../src/useTreeDragDrop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AAIzD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,YAA8B;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,YAAY,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAC1C,IAAI,CACL,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtE,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAgB,EAAE,EAAE;QACpD,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG;YAAE,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;aAC7F,IAAI,KAAK,GAAG,GAAG;YAAE,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;;YACtE,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,cAA6C,EAAE,EAAE;QAChD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;YAAE,OAAO;QACtC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACzF,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,wDAAwD;IAClF,CAAC,EACD,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAC/B,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACrF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@issonujha/sdui-core",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Universal SDUI contracts, tree/reorder algorithms and headless hooks (zero UI, zero network).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"react": ">=17"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/react": "^18.3.3",
|
|
23
|
+
"typescript": "^5.5.4"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.json",
|
|
30
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
31
|
+
"test": "echo \"no tests yet\" && exit 0"
|
|
32
|
+
}
|
|
6
33
|
}
|
package/README.md
DELETED