@keenaioc/data-view 0.0.0-poc.1 → 0.2.0-alpha.11

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.
Files changed (129) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/DATA-PRIVACY.md +20 -0
  3. package/INTEGRATION.md +258 -0
  4. package/KNOWN-LIMITATIONS.md +63 -0
  5. package/LICENSE +41 -0
  6. package/README.md +73 -5
  7. package/dist/column-actions.d.ts +47 -0
  8. package/dist/column-actions.d.ts.map +1 -0
  9. package/dist/column-actions.js +92 -0
  10. package/dist/column-actions.js.map +1 -0
  11. package/dist/column-menu.d.ts +25 -0
  12. package/dist/column-menu.d.ts.map +1 -0
  13. package/dist/column-menu.js +64 -0
  14. package/dist/column-menu.js.map +1 -0
  15. package/dist/contracts.d.ts +33 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/contracts.js +84 -0
  18. package/dist/contracts.js.map +1 -0
  19. package/dist/data-view.d.ts +3 -0
  20. package/dist/data-view.d.ts.map +1 -0
  21. package/dist/data-view.js +883 -0
  22. package/dist/data-view.js.map +1 -0
  23. package/dist/engine.d.ts +35 -0
  24. package/dist/engine.d.ts.map +1 -0
  25. package/dist/engine.js +315 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/field-order.d.ts +8 -0
  28. package/dist/field-order.d.ts.map +1 -0
  29. package/dist/field-order.js +28 -0
  30. package/dist/field-order.js.map +1 -0
  31. package/dist/gantt-bar.d.ts +17 -0
  32. package/dist/gantt-bar.d.ts.map +1 -0
  33. package/dist/gantt-bar.js +142 -0
  34. package/dist/gantt-bar.js.map +1 -0
  35. package/dist/gantt-dependencies.d.ts +27 -0
  36. package/dist/gantt-dependencies.d.ts.map +1 -0
  37. package/dist/gantt-dependencies.js +218 -0
  38. package/dist/gantt-dependencies.js.map +1 -0
  39. package/dist/gantt-dependency-ui.d.ts +37 -0
  40. package/dist/gantt-dependency-ui.d.ts.map +1 -0
  41. package/dist/gantt-dependency-ui.js +79 -0
  42. package/dist/gantt-dependency-ui.js.map +1 -0
  43. package/dist/gantt-grid.d.ts +27 -0
  44. package/dist/gantt-grid.d.ts.map +1 -0
  45. package/dist/gantt-grid.js +72 -0
  46. package/dist/gantt-grid.js.map +1 -0
  47. package/dist/gantt-operations.d.ts +14 -0
  48. package/dist/gantt-operations.d.ts.map +1 -0
  49. package/dist/gantt-operations.js +103 -0
  50. package/dist/gantt-operations.js.map +1 -0
  51. package/dist/group-order.d.ts +8 -0
  52. package/dist/group-order.d.ts.map +1 -0
  53. package/dist/group-order.js +24 -0
  54. package/dist/group-order.js.map +1 -0
  55. package/dist/group-settings.d.ts +17 -0
  56. package/dist/group-settings.d.ts.map +1 -0
  57. package/dist/group-settings.js +44 -0
  58. package/dist/group-settings.js.map +1 -0
  59. package/dist/index.d.ts +17 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +17 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/operations.d.ts +11 -0
  64. package/dist/operations.d.ts.map +1 -0
  65. package/dist/operations.js +117 -0
  66. package/dist/operations.js.map +1 -0
  67. package/dist/registry.d.ts +17 -0
  68. package/dist/registry.d.ts.map +1 -0
  69. package/dist/registry.js +482 -0
  70. package/dist/registry.js.map +1 -0
  71. package/dist/remote-data.d.ts +19 -0
  72. package/dist/remote-data.d.ts.map +1 -0
  73. package/dist/remote-data.js +67 -0
  74. package/dist/remote-data.js.map +1 -0
  75. package/dist/row-move.d.ts +7 -0
  76. package/dist/row-move.d.ts.map +1 -0
  77. package/dist/row-move.js +27 -0
  78. package/dist/row-move.js.map +1 -0
  79. package/dist/schedule-view.d.ts +27 -0
  80. package/dist/schedule-view.d.ts.map +1 -0
  81. package/dist/schedule-view.js +122 -0
  82. package/dist/schedule-view.js.map +1 -0
  83. package/dist/schedule.d.ts +28 -0
  84. package/dist/schedule.d.ts.map +1 -0
  85. package/dist/schedule.js +97 -0
  86. package/dist/schedule.js.map +1 -0
  87. package/dist/style.css +1028 -0
  88. package/dist/timeline.d.ts +25 -0
  89. package/dist/timeline.d.ts.map +1 -0
  90. package/dist/timeline.js +58 -0
  91. package/dist/timeline.js.map +1 -0
  92. package/dist/toolbar.d.ts +10 -0
  93. package/dist/toolbar.d.ts.map +1 -0
  94. package/dist/toolbar.js +31 -0
  95. package/dist/toolbar.js.map +1 -0
  96. package/dist/types.d.ts +474 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +22 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/use-remote-data.d.ts +18 -0
  101. package/dist/use-remote-data.d.ts.map +1 -0
  102. package/dist/use-remote-data.js +12 -0
  103. package/dist/use-remote-data.js.map +1 -0
  104. package/dist/use-row-move.d.ts +12 -0
  105. package/dist/use-row-move.d.ts.map +1 -0
  106. package/dist/use-row-move.js +151 -0
  107. package/dist/use-row-move.js.map +1 -0
  108. package/dist/v2-panels.d.ts +37 -0
  109. package/dist/v2-panels.d.ts.map +1 -0
  110. package/dist/v2-panels.js +118 -0
  111. package/dist/v2-panels.js.map +1 -0
  112. package/dist/view-state.d.ts +30 -0
  113. package/dist/view-state.d.ts.map +1 -0
  114. package/dist/view-state.js +94 -0
  115. package/dist/view-state.js.map +1 -0
  116. package/dist/view-workspace.d.ts +3 -0
  117. package/dist/view-workspace.d.ts.map +1 -0
  118. package/dist/view-workspace.js +95 -0
  119. package/dist/view-workspace.js.map +1 -0
  120. package/dist/virtual-list.d.ts +12 -0
  121. package/dist/virtual-list.d.ts.map +1 -0
  122. package/dist/virtual-list.js +46 -0
  123. package/dist/virtual-list.js.map +1 -0
  124. package/package.json +19 -16
  125. package/index.d.ts +0 -2
  126. package/index.js +0 -5
  127. package/react.d.ts +0 -2
  128. package/react.js +0 -8
  129. package/style.css +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-order.d.ts","sourceRoot":"","sources":["../src/field-order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/D,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CASnH;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,uBAG5E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,uBAOpG"}
@@ -0,0 +1,28 @@
1
+ /** Reorder by stable ID; retain each item's settings and leave the input untouched. */
2
+ export function moveFieldItem(items, fieldId, direction, getId) {
3
+ const from = items.findIndex((item) => getId(item) === fieldId);
4
+ if (from < 0 || items.length < 2)
5
+ return items;
6
+ const to = direction === "first" ? 0 : direction === "last" ? items.length - 1 : direction === "previous" ? from - 1 : from + 1;
7
+ if (to < 0 || to >= items.length || to === from)
8
+ return items;
9
+ const next = [...items];
10
+ const [item] = next.splice(from, 1);
11
+ next.splice(to, 0, item);
12
+ return next;
13
+ }
14
+ /** Pinned regions retain the engine's left / unpinned / right ordering. */
15
+ export function columnMovePeers(columns, fieldId) {
16
+ const current = columns.find((column) => column.fieldId === fieldId);
17
+ return current ? columns.filter((column) => (column.pinned ?? null) === (current.pinned ?? null)) : [];
18
+ }
19
+ export function moveColumnSetting(columns, fieldId, direction) {
20
+ const peers = columnMovePeers(columns, fieldId);
21
+ const moved = moveFieldItem(peers, fieldId, direction, (column) => column.fieldId);
22
+ if (moved === peers)
23
+ return columns;
24
+ const ids = new Set(peers.map((column) => column.fieldId));
25
+ let index = 0;
26
+ return columns.map((column) => ids.has(column.fieldId) ? moved[index++] : column);
27
+ }
28
+ //# sourceMappingURL=field-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-order.js","sourceRoot":"","sources":["../src/field-order.ts"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAI,KAAU,EAAE,OAAe,EAAE,SAAoB,EAAE,KAA0B;IAC5G,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;IAChE,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAChI,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,OAA4B,EAAE,OAAe;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA4B,EAAE,OAAe,EAAE,SAAoB;IACnG,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnF,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ScheduleItem } from "./schedule.js";
2
+ import type { CellCommit, DataViewPermissions, FieldDefinition, GanttMapping } from "./types.js";
3
+ export declare function GanttBar<Row>({ item, fields, mapping, getRowId, monthStart, monthEnd, permissions, busy, onCommit, onOpen, onMessage, previewRequired }: {
4
+ item: ScheduleItem<Row>;
5
+ fields: FieldDefinition<Row>[];
6
+ mapping: GanttMapping;
7
+ getRowId: (row: Row) => string;
8
+ monthStart: number;
9
+ monthEnd: number;
10
+ permissions?: DataViewPermissions<Row>;
11
+ busy?: boolean;
12
+ previewRequired?: boolean;
13
+ onCommit?: (changes: CellCommit<Row>[]) => Promise<boolean | "cancelled">;
14
+ onOpen: (row: Row) => void;
15
+ onMessage: (message: string) => void;
16
+ }): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=gantt-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-bar.d.ts","sourceRoot":"","sources":["../src/gantt-bar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGjG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,eAAuB,EAAE,EAAE;IAChK,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAC/G,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACxH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7I,2CAyFA"}
@@ -0,0 +1,142 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { adjustGanttRange, canDragGantt, createGanttChanges, ganttDuration } from "./gantt-operations.js";
5
+ import { dayString } from "./schedule.js";
6
+ export function GanttBar({ item, fields, mapping, getRowId, monthStart, monthEnd, permissions, busy, onCommit, onOpen, onMessage, previewRequired = false }) {
7
+ const dragRef = useRef(null);
8
+ const pendingRef = useRef(false);
9
+ const suppressClickUntil = useRef(0);
10
+ const [preview, setPreview] = useState(null);
11
+ const [saving, setSaving] = useState(false);
12
+ const writable = Boolean(onCommit && canDragGantt(item.row, fields, mapping, permissions));
13
+ const editable = writable && !busy && !saving;
14
+ const range = preview ?? item;
15
+ const duration = ganttDuration(range.start, range.end, mapping.workdaysOnly);
16
+ const durationText = `${duration}${mapping.workdaysOnly ? " 工作天" : " 天"}`;
17
+ const summary = `${item.title},${dayString(range.start)} 至 ${dayString(range.end)},${durationText}`;
18
+ const monthLength = monthEnd - monthStart + 1;
19
+ const left = Math.max(monthStart, Math.min(monthEnd, range.start));
20
+ const right = Math.min(monthEnd, Math.max(left, range.end));
21
+ const short = right - left < 3;
22
+ const color = item.color ?? "#316bff";
23
+ const rgb = /^#[0-9a-f]{6}$/i.test(color) ? color.slice(1).match(/../g).map((v) => parseInt(v, 16)) : [49, 107, 255];
24
+ const textColor = rgb[0] * .299 + rgb[1] * .587 + rgb[2] * .114 > 160 ? "#17251c" : "#ffffff";
25
+ const style = { left: `${100 * (left - monthStart) / monthLength}%`, width: `${100 * (right - left + 1) / monthLength}%`, backgroundColor: color, color: textColor };
26
+ function cancel(target) {
27
+ const drag = dragRef.current;
28
+ dragRef.current = null;
29
+ setPreview(null);
30
+ if (drag && target?.hasPointerCapture(drag.pointerId))
31
+ target.releasePointerCapture(drag.pointerId);
32
+ if (drag) {
33
+ suppressClickUntil.current = Date.now() + 500;
34
+ onMessage("已取消日期調整");
35
+ }
36
+ }
37
+ function begin(event, action) {
38
+ if (!editable || pendingRef.current || dragRef.current || event.button !== 0 || !event.isPrimary)
39
+ return;
40
+ const track = event.currentTarget.closest(".hy-dv-gantt-track");
41
+ const dayWidth = (track?.getBoundingClientRect().width ?? 0) / monthLength;
42
+ if (!dayWidth)
43
+ return;
44
+ dragRef.current = { pointerId: event.pointerId, x: event.clientX, y: event.clientY, dayWidth, action, item, mapping: { ...mapping }, delta: 0, moved: false };
45
+ event.currentTarget.setPointerCapture(event.pointerId);
46
+ event.currentTarget.focus();
47
+ onMessage("");
48
+ }
49
+ function move(event) {
50
+ const drag = dragRef.current;
51
+ if (!drag || drag.pointerId !== event.pointerId)
52
+ return;
53
+ const dx = event.clientX - drag.x;
54
+ const dy = event.clientY - drag.y;
55
+ if (event.pointerType === "touch" && !drag.moved && Math.abs(dy) > 8 && Math.abs(dy) > Math.abs(dx)) {
56
+ cancel(event.currentTarget);
57
+ return;
58
+ }
59
+ if (Math.abs(dx) < 4 && !drag.moved)
60
+ return;
61
+ event.preventDefault();
62
+ drag.moved = true;
63
+ drag.delta = Math.round(dx / drag.dayWidth);
64
+ try {
65
+ const next = adjustGanttRange(drag.item, drag.action, drag.delta, drag.mapping.workdaysOnly);
66
+ setPreview(next);
67
+ onMessage(`${dayString(next.start)} 至 ${dayString(next.end)} · ${ganttDuration(next.start, next.end, drag.mapping.workdaysOnly)}${drag.mapping.workdaysOnly ? " 工作天" : " 天"},${previewRequired ? "放開預覽" : "放開儲存"},Esc 取消`);
68
+ }
69
+ catch (error) {
70
+ onMessage(error instanceof Error ? error.message : "日期無法調整");
71
+ }
72
+ }
73
+ async function save(snapshot, originalMapping, action, delta) {
74
+ if (!onCommit || pendingRef.current || !editable) {
75
+ setPreview(null);
76
+ return;
77
+ }
78
+ if (originalMapping.startFieldId !== mapping.startFieldId || originalMapping.endFieldId !== mapping.endFieldId || originalMapping.workdaysOnly !== mapping.workdaysOnly) {
79
+ setPreview(null);
80
+ onMessage("日期設定已變更,請重新拖曳");
81
+ return;
82
+ }
83
+ try {
84
+ const changes = createGanttChanges(snapshot.row, fields, originalMapping, getRowId, action, delta, permissions);
85
+ if (!changes.length) {
86
+ setPreview(null);
87
+ onMessage("");
88
+ return;
89
+ }
90
+ pendingRef.current = true;
91
+ setSaving(true);
92
+ const next = adjustGanttRange(snapshot, action, delta, originalMapping.workdaysOnly);
93
+ setPreview(next);
94
+ const saved = await onCommit(changes);
95
+ onMessage(saved === "cancelled" ? "已取消日期調整" : saved ? `已儲存:${dayString(next.start)} 至 ${dayString(next.end)}` : "儲存失敗或版本衝突,日期維持原值。");
96
+ }
97
+ catch (error) {
98
+ onMessage(error instanceof Error ? error.message : "日期儲存失敗");
99
+ }
100
+ finally {
101
+ pendingRef.current = false;
102
+ setSaving(false);
103
+ setPreview(null);
104
+ }
105
+ }
106
+ function finish(event) {
107
+ const drag = dragRef.current;
108
+ if (!drag || drag.pointerId !== event.pointerId)
109
+ return;
110
+ drag.delta = Math.round((event.clientX - drag.x) / drag.dayWidth);
111
+ drag.moved = drag.moved || Math.abs(event.clientX - drag.x) >= 4;
112
+ dragRef.current = null;
113
+ if (event.currentTarget.hasPointerCapture(event.pointerId))
114
+ event.currentTarget.releasePointerCapture(event.pointerId);
115
+ if (drag.moved) {
116
+ suppressClickUntil.current = Date.now() + 500;
117
+ void save(drag.item, drag.mapping, drag.action, drag.delta);
118
+ }
119
+ else {
120
+ setPreview(null);
121
+ onMessage("");
122
+ }
123
+ }
124
+ function key(event, action) {
125
+ if (event.key === "Escape" && dragRef.current) {
126
+ event.preventDefault();
127
+ cancel(event.currentTarget);
128
+ return;
129
+ }
130
+ if ((event.key === "ArrowLeft" || event.key === "ArrowRight") && editable && !dragRef.current) {
131
+ event.preventDefault();
132
+ event.stopPropagation();
133
+ void save(item, mapping, action, event.key === "ArrowRight" ? 1 : -1);
134
+ }
135
+ }
136
+ return _jsxs("div", { className: `hy-dv-gantt-bar ${editable ? "is-editable" : ""} ${preview ? "is-preview" : ""} ${saving ? "is-saving" : ""}`, style: style, title: summary, children: [_jsxs("button", { type: "button", className: "hy-dv-gantt-move", "aria-label": `${summary}${editable ? ";拖曳或左右鍵平移日期" : ";開啟詳情"}`, "aria-busy": saving, onPointerDown: (event) => begin(event, "move"), onPointerMove: move, onPointerUp: finish, onPointerCancel: (event) => cancel(event.currentTarget), onLostPointerCapture: () => { if (dragRef.current)
137
+ cancel(); }, onKeyDown: (event) => key(event, "move"), onClick: () => { if (!pendingRef.current && Date.now() >= suppressClickUntil.current)
138
+ onOpen(item.row); }, children: [_jsx("span", { className: "hy-dv-gantt-progress", "aria-hidden": true, style: { width: `${(item.progress ?? 0) * 100}%` } }), mapping.showTitle !== false && !short && _jsx("span", { className: "hy-dv-gantt-title", children: item.title }), mapping.showDuration !== false && _jsxs("span", { className: "hy-dv-gantt-duration", children: [duration, "\u5929"] }), mapping.showDuration === false && item.progress !== undefined && _jsxs("span", { className: "hy-dv-gantt-duration", children: [Math.round(item.progress * 100), "%"] })] }), writable && item.start >= monthStart && _jsx("button", { type: "button", className: "hy-dv-gantt-handle is-start", "aria-disabled": !editable, "aria-label": `調整 ${item.title} 開始日期;拖曳或使用左右鍵`, onPointerDown: (event) => begin(event, "start"), onPointerMove: move, onPointerUp: finish, onPointerCancel: (event) => cancel(event.currentTarget), onLostPointerCapture: () => { if (dragRef.current)
139
+ cancel(); }, onKeyDown: (event) => key(event, "start"), onClick: (event) => event.stopPropagation() }), writable && item.end <= monthEnd && _jsx("button", { type: "button", className: "hy-dv-gantt-handle is-end", "aria-disabled": !editable, "aria-label": `調整 ${item.title} 結束日期;拖曳或使用左右鍵`, onPointerDown: (event) => begin(event, "end"), onPointerMove: move, onPointerUp: finish, onPointerCancel: (event) => cancel(event.currentTarget), onLostPointerCapture: () => { if (dragRef.current)
140
+ cancel(); }, onKeyDown: (event) => key(event, "end"), onClick: (event) => event.stopPropagation() }), mapping.showTitle !== false && short && _jsx("span", { className: "hy-dv-gantt-outside-title", "aria-hidden": true, children: item.title })] });
141
+ }
142
+ //# sourceMappingURL=gantt-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-bar.js","sourceRoot":"","sources":["../src/gantt-bar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { BatchCommit, CellCommit, FieldDefinition, GanttDependency, GanttDependencyChange, GanttDependencyState, GanttMapping, DataViewPermissions, GanttScheduleGuard } from "./types.js";
2
+ /** Bounded graph validation. This validates relationships, not business workflow policy. */
3
+ export declare function validateGanttDependencies(links: GanttDependency[]): string | null;
4
+ export declare function applyGanttDependencyChange<Row>(state: GanttDependencyState<Row>, change: GanttDependencyChange): GanttDependency[];
5
+ /** Day-granularity FS: zero lag means the next day (or next Mon–Fri workday). */
6
+ export declare function dependencyEarliestStart(end: number, lagDays: number, workdaysOnly?: boolean): number;
7
+ export type GanttReschedulePlan<Row> = {
8
+ request: BatchCommit<Row>;
9
+ rootRowId: string;
10
+ affectedRowIds: string[];
11
+ unplannedCount: number;
12
+ };
13
+ /** Pure preview: never mutates data. Only pushes descendants later when an FS constraint requires it. */
14
+ export declare function createGanttReschedulePlan<Row>({ rows, fields, mapping, getRowId, dependencies, changes, permissions }: {
15
+ rows: Row[];
16
+ fields: FieldDefinition<Row>[];
17
+ mapping: GanttMapping;
18
+ getRowId: (row: Row) => string;
19
+ dependencies: GanttDependencyState<Row>;
20
+ changes: CellCommit<Row>[];
21
+ permissions?: DataViewPermissions<Row>;
22
+ }): GanttReschedulePlan<Row>;
23
+ /** Repeat both client-side at confirmation and server-side in the write transaction. */
24
+ export declare function validateGanttScheduleGuard<Row>(guard: GanttScheduleGuard, rows: Row[], fields: FieldDefinition<Row>[], getRowId: (row: Row) => string, state?: GanttDependencyState<Row>): void;
25
+ /** History retains the read set, swapping expected values only for the cells actually changed. */
26
+ export declare function ganttHistoryGuard<Row>(guard: GanttScheduleGuard | undefined, changes: CellCommit<Row>[], undo: boolean): GanttScheduleGuard | undefined;
27
+ //# sourceMappingURL=gantt-dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependencies.d.ts","sourceRoot":"","sources":["../src/gantt-dependencies.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhM,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,GAAG,IAAI,CAgBjF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,qBAAqB,GAAG,eAAe,EAAE,CAOlI;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,UAMzF;AAED,MAAM,MAAM,mBAAmB,CAAC,GAAG,IAAI;IACrC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IACtH,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IACnG,YAAY,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;CAC7G,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAuE3B;AAED,wFAAwF;AACxF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,KAAK,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,QASxL;AAED,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAOvJ"}
@@ -0,0 +1,218 @@
1
+ import { DataViewConflictError, getFieldValue } from "./engine.js";
2
+ import { createGanttChanges, isWorkday } from "./gantt-operations.js";
3
+ import { newOperationId, validateChanges } from "./operations.js";
4
+ import { dateDay, dayString } from "./schedule.js";
5
+ /** Bounded graph validation. This validates relationships, not business workflow policy. */
6
+ export function validateGanttDependencies(links) {
7
+ if (links.length > 2000)
8
+ return "依賴連線最多 2,000 條";
9
+ const ids = new Set();
10
+ const pairs = new Set();
11
+ const degrees = new Map();
12
+ const edges = new Map();
13
+ for (const link of links) {
14
+ if (!link.id || !link.predecessorId || !link.successorId || link.predecessorId === link.successorId)
15
+ return "依賴必須連接兩筆不同的資料";
16
+ const pair = JSON.stringify([link.predecessorId, link.successorId]);
17
+ if (ids.has(link.id) || pairs.has(pair))
18
+ return "依賴連線不可重複";
19
+ if (!Number.isInteger(link.lagDays) || link.lagDays < 0 || link.lagDays > 365)
20
+ return "等待天數需介於 0–365";
21
+ ids.add(link.id);
22
+ pairs.add(pair);
23
+ degrees.set(link.predecessorId, degrees.get(link.predecessorId) ?? 0);
24
+ degrees.set(link.successorId, (degrees.get(link.successorId) ?? 0) + 1);
25
+ edges.set(link.predecessorId, [...(edges.get(link.predecessorId) ?? []), link.successorId]);
26
+ }
27
+ const queue = [...degrees].filter(([, count]) => count === 0).map(([id]) => id);
28
+ for (let i = 0; i < queue.length; i++)
29
+ for (const id of edges.get(queue[i]) ?? []) {
30
+ degrees.set(id, degrees.get(id) - 1);
31
+ if (degrees.get(id) === 0)
32
+ queue.push(id);
33
+ }
34
+ return queue.length !== degrees.size ? "依賴形成循環,請移除互相等待的連線" : null;
35
+ }
36
+ export function applyGanttDependencyChange(state, change) {
37
+ if (state.revision !== change.revision)
38
+ throw new DataViewConflictError("依賴已更新,請重新操作");
39
+ if (!state.complete)
40
+ throw new Error("需載入完整依賴關係後才能修改");
41
+ if (change.action === "delete" && !state.links.some((link) => link.id === change.linkId))
42
+ throw new DataViewConflictError("連線已不存在");
43
+ const next = change.action === "add" ? [...state.links, change.link] : state.links.filter((link) => link.id !== change.linkId);
44
+ const error = validateGanttDependencies(next);
45
+ if (error)
46
+ throw new Error(error);
47
+ return next;
48
+ }
49
+ /** Day-granularity FS: zero lag means the next day (or next Mon–Fri workday). */
50
+ export function dependencyEarliestStart(end, lagDays, workdaysOnly = false) {
51
+ if (!Number.isInteger(end) || !Number.isInteger(lagDays) || lagDays < 0 || lagDays > 365)
52
+ throw new Error("無效的依賴日期或等待天數");
53
+ let day = end;
54
+ for (let step = 0; step <= lagDays; step++) {
55
+ day++;
56
+ if (workdaysOnly)
57
+ while (!isWorkday(day))
58
+ day++;
59
+ }
60
+ if (day > dateDay("9999-12-31"))
61
+ throw new Error("日期超出支援範圍");
62
+ return day;
63
+ }
64
+ /** Pure preview: never mutates data. Only pushes descendants later when an FS constraint requires it. */
65
+ export function createGanttReschedulePlan({ rows, fields, mapping, getRowId, dependencies, changes, permissions }) {
66
+ if (!dependencies.complete || !dependencies.revision)
67
+ throw new Error("依賴資料尚未完整載入,無法預覽改期");
68
+ const graphError = validateGanttDependencies(dependencies.links);
69
+ if (graphError)
70
+ throw new Error(graphError);
71
+ const startField = fields.find((f) => f.id === mapping.startFieldId);
72
+ const endField = fields.find((f) => f.id === mapping.endFieldId);
73
+ if (!startField || !endField || startField.id === endField.id || ![startField, endField].every((f) => ["date", "dateTime"].includes(f.type)))
74
+ throw new Error("請先指定兩個不同的日期欄位");
75
+ const rootRowId = changes[0]?.rowId;
76
+ if (!rootRowId || changes.length !== 2 || !changes.every((c) => c.rowId === rootRowId) || ![startField, endField].every((f) => changes.filter((c) => c.field.id === f.id).length === 1))
77
+ throw new Error("改期預覽需包含同一筆資料的起訖日期");
78
+ const rowMap = new Map(rows.map((row) => [getRowId(row), row]));
79
+ if (rowMap.size !== rows.length)
80
+ throw new Error("資料 ID 不可重複");
81
+ // Whole connected component includes upstream guards and every branch, even filtered/offscreen rows.
82
+ const adjacent = new Map();
83
+ const incoming = new Map();
84
+ const outgoing = new Map();
85
+ for (const link of dependencies.links) {
86
+ adjacent.set(link.predecessorId, [...(adjacent.get(link.predecessorId) ?? []), link.successorId]);
87
+ adjacent.set(link.successorId, [...(adjacent.get(link.successorId) ?? []), link.predecessorId]);
88
+ incoming.set(link.successorId, [...(incoming.get(link.successorId) ?? []), link]);
89
+ outgoing.set(link.predecessorId, [...(outgoing.get(link.predecessorId) ?? []), link]);
90
+ }
91
+ const component = new Set([rootRowId]);
92
+ const queue = [rootRowId];
93
+ for (let i = 0; i < queue.length; i++)
94
+ for (const id of adjacent.get(queue[i]) ?? [])
95
+ if (!component.has(id)) {
96
+ component.add(id);
97
+ queue.push(id);
98
+ }
99
+ if (component.size > 500)
100
+ throw new Error("單次改期最多涵蓋 500 筆相關資料");
101
+ const ranges = new Map();
102
+ const checks = [];
103
+ for (const id of component) {
104
+ const row = rowMap.get(id);
105
+ if (!row || [startField, endField].some((field) => field.canRead?.({ row, field }) === false))
106
+ throw new Error("相關排程資料不完整或無讀取權限,請交由有權限的人員處理");
107
+ const startValue = getFieldValue(row, startField);
108
+ const endValue = getFieldValue(row, endField);
109
+ const start = dateDay(startValue);
110
+ const end = dateDay(endValue);
111
+ for (const [field, value] of [[startField, startValue], [endField, endValue]])
112
+ if (field.type === "dateTime" && value != null && value !== "" && (typeof value !== "string" || !Number.isFinite(Date.parse(value))))
113
+ throw new Error("相關排程含無效日期時間,請先修正後再預覽");
114
+ // Blank dates are normal unscheduled work. Invalid nonblank values require correction.
115
+ if ((startValue != null && startValue !== "" && start === null) || (endValue != null && endValue !== "" && end === null) || (start !== null && end !== null && end < start))
116
+ throw new Error("相關排程含無效日期,請先修正後再預覽");
117
+ ranges.set(id, start === null || end === null ? null : { start, end });
118
+ checks.push({ rowId: id, startValue: structuredClone(startValue), endValue: structuredClone(endValue) });
119
+ }
120
+ const root = rowMap.get(rootRowId);
121
+ if (dependencies.isDateLocked?.(root))
122
+ throw new Error("這筆日期已確認或鎖定,請先解除鎖定再改期");
123
+ for (const c of changes)
124
+ if (JSON.stringify(getFieldValue(root, c.field)) !== JSON.stringify(c.previousValue))
125
+ throw new DataViewConflictError();
126
+ const rootStart = dateDay(changes.find((c) => c.field.id === startField.id).nextValue);
127
+ const rootEnd = dateDay(changes.find((c) => c.field.id === endField.id).nextValue);
128
+ if (rootStart === null || rootEnd === null || rootEnd < rootStart)
129
+ throw new Error("無效的改期範圍");
130
+ const finalChanges = [...changes];
131
+ ranges.set(rootRowId, { start: rootStart, end: rootEnd });
132
+ const affected = [rootRowId];
133
+ const unplanned = new Set();
134
+ // Root may not move ahead of an existing predecessor.
135
+ for (const link of incoming.get(rootRowId) ?? []) {
136
+ const before = ranges.get(link.predecessorId);
137
+ if (!before) {
138
+ unplanned.add(link.predecessorId);
139
+ continue;
140
+ }
141
+ if (rootStart < dependencyEarliestStart(before.end, link.lagDays, mapping.workdaysOnly))
142
+ throw new Error(`改期早於前置工作的可開始日期 ${dayString(dependencyEarliestStart(before.end, link.lagDays, mapping.workdaysOnly))}`);
143
+ }
144
+ const descendants = new Set();
145
+ const descendQueue = [rootRowId];
146
+ for (let i = 0; i < descendQueue.length; i++)
147
+ for (const link of outgoing.get(descendQueue[i]) ?? [])
148
+ if (!descendants.has(link.successorId)) {
149
+ descendants.add(link.successorId);
150
+ descendQueue.push(link.successorId);
151
+ }
152
+ const degree = new Map([...component].map((id) => [id, (incoming.get(id) ?? []).length]));
153
+ const order = [...component].filter((id) => degree.get(id) === 0);
154
+ for (let i = 0; i < order.length; i++)
155
+ for (const link of outgoing.get(order[i]) ?? []) {
156
+ degree.set(link.successorId, degree.get(link.successorId) - 1);
157
+ if (degree.get(link.successorId) === 0)
158
+ order.push(link.successorId);
159
+ }
160
+ for (const id of order) {
161
+ if (!descendants.has(id))
162
+ continue;
163
+ const range = ranges.get(id);
164
+ if (!range) {
165
+ unplanned.add(id);
166
+ continue;
167
+ }
168
+ let minimum = range.start;
169
+ for (const link of incoming.get(id) ?? []) {
170
+ const before = ranges.get(link.predecessorId);
171
+ if (!before) {
172
+ unplanned.add(link.predecessorId);
173
+ continue;
174
+ }
175
+ minimum = Math.max(minimum, dependencyEarliestStart(before.end, link.lagDays, mapping.workdaysOnly));
176
+ }
177
+ if (minimum === range.start)
178
+ continue; // Keep existing buffer; no automatic pull-forward.
179
+ const row = rowMap.get(id);
180
+ if (dependencies.isDateLocked?.(row))
181
+ throw new Error("後續有已確認或鎖定的日期,需先協調後才能套用改期");
182
+ const next = createGanttChanges(row, fields, mapping, getRowId, "move", minimum - range.start, permissions);
183
+ finalChanges.push(...next);
184
+ affected.push(id);
185
+ ranges.set(id, { start: dateDay(next.find((c) => c.field.id === startField.id).nextValue), end: dateDay(next.find((c) => c.field.id === endField.id).nextValue) });
186
+ }
187
+ const error = validateChanges(finalChanges, permissions);
188
+ if (error)
189
+ throw new Error(error);
190
+ return { rootRowId, affectedRowIds: affected, unplannedCount: unplanned.size, request: { id: newOperationId(), reason: "edit", changes: finalChanges, scheduleGuard: { revision: dependencies.revision, startFieldId: startField.id, endFieldId: endField.id, workdaysOnly: mapping.workdaysOnly === true, checks } } };
191
+ }
192
+ /** Repeat both client-side at confirmation and server-side in the write transaction. */
193
+ export function validateGanttScheduleGuard(guard, rows, fields, getRowId, state) {
194
+ if (!state?.complete || state.revision !== guard.revision)
195
+ throw new DataViewConflictError("依賴關係已更新,請重新預覽");
196
+ const start = fields.find((f) => f.id === guard.startFieldId);
197
+ const end = fields.find((f) => f.id === guard.endFieldId);
198
+ if (!start || !end)
199
+ throw new DataViewConflictError("日期欄位已變更");
200
+ const rowMap = new Map(rows.map((row) => [getRowId(row), row]));
201
+ for (const check of guard.checks) {
202
+ const row = rowMap.get(check.rowId);
203
+ if (!row || [start, end].some((field) => field.canRead?.({ row, field }) === false) || JSON.stringify(getFieldValue(row, start)) !== JSON.stringify(check.startValue) || JSON.stringify(getFieldValue(row, end)) !== JSON.stringify(check.endValue))
204
+ throw new DataViewConflictError("預覽後相關日期已更新或無權限,請重新預覽");
205
+ }
206
+ }
207
+ /** History retains the read set, swapping expected values only for the cells actually changed. */
208
+ export function ganttHistoryGuard(guard, changes, undo) {
209
+ if (!guard)
210
+ return undefined;
211
+ const values = new Map(changes.map((c) => [JSON.stringify([c.rowId, c.field.id]), undo ? c.nextValue : c.previousValue]));
212
+ return { ...guard, checks: guard.checks.map((check) => {
213
+ const startKey = JSON.stringify([check.rowId, guard.startFieldId]);
214
+ const endKey = JSON.stringify([check.rowId, guard.endFieldId]);
215
+ return { ...check, startValue: values.has(startKey) ? values.get(startKey) : check.startValue, endValue: values.has(endKey) ? values.get(endKey) : check.endValue };
216
+ }) };
217
+ }
218
+ //# sourceMappingURL=gantt-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependencies.js","sourceRoot":"","sources":["../src/gantt-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGnD,4FAA4F;AAC5F,MAAM,UAAU,yBAAyB,CAAC,KAAwB;IAChE,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,OAAO,gBAAgB,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IACrJ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO,eAAe,CAAC;QAC5H,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,UAAU,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG;YAAE,OAAO,eAAe,CAAC;QACtG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IACxK,OAAO,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAM,KAAgC,EAAE,MAA6B;IAC7G,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACpI,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/H,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,OAAe,EAAE,YAAY,GAAG,KAAK;IACxF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1H,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,EAAE,CAAC;QAAC,IAAI,YAAY;YAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;gBAAE,GAAG,EAAE,CAAC;IAAC,CAAC;IACvG,IAAI,GAAG,GAAG,OAAO,CAAC,YAAY,CAAE;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC;AACb,CAAC;AASD,yGAAyG;AACzG,MAAM,UAAU,yBAAyB,CAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAGnH;IACC,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC3F,MAAM,UAAU,GAAG,yBAAyB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAAC,IAAI,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9G,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACvI,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/K,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACpC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC9N,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAC/D,qGAAqG;IACrG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC3J,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAClG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAChG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAClF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAAC,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;IACpJ,IAAI,SAAS,CAAC,IAAI,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiD,CAAC;IACxE,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjG,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAU;YAAE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtQ,uFAAuF;QACvF,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,UAAU,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnN,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;IACpC,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/E,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;YAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACjJ,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAE,CAAC,SAAS,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAE,CAAC,SAAS,CAAC,CAAC;IACpF,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC;IAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAClE,sDAAsD;IACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7D,IAAI,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACnN,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAAC,CAAC;IACzN,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAE,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;IAClO,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC7D,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,CAAC,KAAK;YAAE,SAAS,CAAC,mDAAmD;QAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC5B,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5G,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAE,CAAC,SAAS,CAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAE,CAAC,SAAS,CAAE,EAAE,CAAC,CAAC;IACzK,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAAC,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC1T,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CAAM,KAAyB,EAAE,IAAW,EAAE,MAA8B,EAAE,QAA8B,EAAE,KAAiC;IACvL,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QAAE,MAAM,IAAI,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;IAAC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACzH,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IAC/S,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAM,KAAqC,EAAE,OAA0B,EAAE,IAAa;IACrH,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1H,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAAC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACnI,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtK,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type GanttReschedulePlan } from "./gantt-dependencies.js";
2
+ import type { FieldDefinition, GanttDependencyChange, GanttDependencyState, GanttMapping } from "./types.js";
3
+ import type { ScheduleItem } from "./schedule.js";
4
+ export declare function scheduleRowLabel<Row>(row: Row, fields: FieldDefinition<Row>[], mapping: GanttMapping): string;
5
+ export declare function GanttDependencyPanel<Row>({ rows, fields, mapping, getRowId, state, onChange, onClose, busy }: {
6
+ rows: Row[];
7
+ fields: FieldDefinition<Row>[];
8
+ mapping: GanttMapping;
9
+ getRowId: (row: Row) => string;
10
+ state: GanttDependencyState<Row>;
11
+ onChange?: (change: GanttDependencyChange) => Promise<boolean>;
12
+ onClose: () => void;
13
+ busy: boolean;
14
+ }): import("react/jsx-runtime").JSX.Element;
15
+ export declare function GanttRescheduleReview<Row>({ plan, fields, mapping, onClose, onApply, busy, error }: {
16
+ plan: GanttReschedulePlan<Row>;
17
+ fields: FieldDefinition<Row>[];
18
+ mapping: GanttMapping;
19
+ onClose: () => void;
20
+ onApply: () => void;
21
+ busy: boolean;
22
+ error: string;
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ /** Draw only endpoints visible on this page and within the displayed time window. */
25
+ export declare function GanttDependencyLines<Row>({ items, state, start, end, workdaysOnly, dayWidth, rowHeight }: {
26
+ dayWidth?: number;
27
+ rowHeight?: number;
28
+ items: Array<{
29
+ item: ScheduleItem<Row>;
30
+ y: number;
31
+ }>;
32
+ state: GanttDependencyState<Row>;
33
+ start: number;
34
+ end: number;
35
+ workdaysOnly?: boolean;
36
+ }): import("react/jsx-runtime").JSX.Element;
37
+ //# sourceMappingURL=gantt-dependency-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependency-ui.d.ts","sourceRoot":"","sources":["../src/gantt-dependency-ui.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAuD,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGxH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,UAGpG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC7G,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IACnG,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;CACtI,2CA8BA;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IACnG,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IACtF,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CACxE,2CAWA;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,QAAa,EAAE,SAAc,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,2CAezS"}