@wipco/sdui 0.50.6 → 1.0.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.
Files changed (111) hide show
  1. package/dist/{DatePicker-BK_jsV7i.d.ts → DatePicker-C_TT_SOw.d.ts} +25 -0
  2. package/dist/{chunk-OEWTVLPZ.js → chunk-2HLXCKK7.js} +2 -2
  3. package/dist/{chunk-PWVHAUJC.js → chunk-2YP5N4VV.js} +6 -4
  4. package/dist/{chunk-QTHYLNJW.js → chunk-37SFFW37.js} +2 -13
  5. package/dist/{chunk-YQOMSWW5.js → chunk-5WW4MBRO.js} +1 -1
  6. package/dist/{chunk-LIOS3PF2.js → chunk-5XPZ3RSA.js} +3 -4
  7. package/dist/{chunk-ZD3VNVRF.js → chunk-7BGDSSAN.js} +5 -13
  8. package/dist/{chunk-Y2LIEWQX.js → chunk-7FZTUI6U.js} +6 -5
  9. package/dist/{chunk-HJ5VSXR4.js → chunk-7P7N43JV.js} +2 -2
  10. package/dist/{chunk-55VB6SDU.js → chunk-A5XQOEVH.js} +23 -20
  11. package/dist/{chunk-77LKJCMM.js → chunk-A6LAIGUS.js} +20 -108
  12. package/dist/{chunk-YXS5FXVS.js → chunk-AC5TI3BE.js} +7 -16
  13. package/dist/{chunk-AIOJYVJ2.js → chunk-AXGF4M57.js} +1 -1
  14. package/dist/{chunk-5MPK3NZK.js → chunk-B6WMC2AN.js} +3 -3
  15. package/dist/{chunk-C6ZV4VBN.js → chunk-C37U3GCC.js} +4 -4
  16. package/dist/{chunk-265YPW4W.js → chunk-DMLDKW7K.js} +1 -1
  17. package/dist/{chunk-FZ72IDVF.js → chunk-E6ISNQK3.js} +2 -2
  18. package/dist/{chunk-STX2AX6Y.js → chunk-FLAN7CV3.js} +7 -39
  19. package/dist/{chunk-IV5YTVHR.js → chunk-GE6BYNQJ.js} +18 -33
  20. package/dist/{chunk-ZX36LKJ7.js → chunk-GTGS2QRL.js} +7 -6
  21. package/dist/{chunk-NL3I6F2I.js → chunk-HBBTENSV.js} +3 -3
  22. package/dist/{chunk-RUU7WBGR.js → chunk-I45EUZC6.js} +19 -9
  23. package/dist/{chunk-JBKNIALK.js → chunk-I5SD7XRA.js} +9 -6
  24. package/dist/{chunk-X7GHY2RI.js → chunk-IFKYGJXP.js} +14 -42
  25. package/dist/{chunk-J3YMUR6R.js → chunk-IZ3JA2BR.js} +3 -3
  26. package/dist/{chunk-AUW5RP24.js → chunk-JIV4YHCZ.js} +7 -6
  27. package/dist/{chunk-M6KM3FJS.js → chunk-JYAR7D5U.js} +2 -2
  28. package/dist/{chunk-DKPNFEVU.js → chunk-KO6OEY3G.js} +19 -6
  29. package/dist/{chunk-JHHMFL5D.js → chunk-LFEJLOFN.js} +28 -16
  30. package/dist/chunk-MMIGOPO5.js +111 -0
  31. package/dist/{chunk-YSSNP6JM.js → chunk-N25YP7ID.js} +6 -21
  32. package/dist/{chunk-F2W2FWOT.js → chunk-N5RKM6IC.js} +7 -7
  33. package/dist/{chunk-C4HYWZML.js → chunk-O4IISNE7.js} +1 -1
  34. package/dist/chunk-Q4SWUINA.js +51 -0
  35. package/dist/{chunk-TUOG7EEI.js → chunk-RNOUXUBO.js} +418 -22
  36. package/dist/{chunk-4VZI3PLI.js → chunk-RYHEV5E3.js} +15 -39
  37. package/dist/{chunk-AVRNQOB5.js → chunk-SAPBDJJQ.js} +14 -13
  38. package/dist/{chunk-OPJ4DYNI.js → chunk-SJ3737RA.js} +156 -158
  39. package/dist/{chunk-UMANGYRD.js → chunk-TFGNKFL2.js} +1 -1
  40. package/dist/{chunk-KYGSMUUU.js → chunk-VY7MVBSE.js} +2 -2
  41. package/dist/{chunk-VDBUXYEB.js → chunk-WOYMEEPH.js} +8 -8
  42. package/dist/{chunk-I5Z2RVDF.js → chunk-WSLT32Q4.js} +278 -30
  43. package/dist/{chunk-NYUHSMUU.js → chunk-XGFDY43I.js} +2 -2
  44. package/dist/{chunk-ODKZF4IT.js → chunk-YOZN35HD.js} +17 -9
  45. package/dist/{chunk-EKP6Z3G6.js → chunk-YVTV4ZV6.js} +1 -1
  46. package/dist/{chunk-6BCWFPNJ.js → chunk-YWUDBLO6.js} +2 -2
  47. package/dist/chunk-Z4PYMTTS.js +41 -0
  48. package/dist/{chunk-WXIQLWIX.js → chunk-ZFNFPXPR.js} +2 -2
  49. package/dist/{chunk-7GOWOSX6.js → chunk-ZORQPB6B.js} +11 -5
  50. package/dist/index.d.ts +1096 -941
  51. package/dist/index.js +369 -610
  52. package/dist/meta.d.ts +13 -12
  53. package/dist/meta.js +84 -16
  54. package/dist/rich/ExcelUploadCard.d.ts +7 -0
  55. package/dist/rich/ExcelUploadCard.js +17 -13
  56. package/dist/rich.d.ts +1 -1
  57. package/dist/rich.js +25 -12
  58. package/dist/styles.css +10 -2
  59. package/dist/{types-D14eqLpf.d.ts → types-C7y9CpgF.d.ts} +7 -5
  60. package/dist/widgets/ApprovalLineEditor.js +7 -6
  61. package/dist/widgets/ApprovalOverridesEditor.d.ts +11 -1
  62. package/dist/widgets/ApprovalOverridesEditor.js +9 -8
  63. package/dist/widgets/ApprovalStepper.js +3 -3
  64. package/dist/widgets/AutocompleteField.d.ts +1 -0
  65. package/dist/widgets/AutocompleteField.js +7 -6
  66. package/dist/widgets/ColumnBoard.js +3 -3
  67. package/dist/widgets/DiffView.js +3 -3
  68. package/dist/widgets/Disclosure.js +3 -3
  69. package/dist/widgets/EventCalendar.d.ts +16 -1
  70. package/dist/widgets/EventCalendar.js +3 -3
  71. package/dist/widgets/FileDropzone.js +7 -6
  72. package/dist/widgets/ImageLightbox.js +5 -4
  73. package/dist/widgets/InlineEdit.js +3 -3
  74. package/dist/widgets/JsonField.js +3 -3
  75. package/dist/widgets/LiveClock.js +2 -2
  76. package/dist/widgets/OptionSchemaEditor.js +4 -4
  77. package/dist/widgets/OptionValueFields.d.ts +5 -0
  78. package/dist/widgets/OptionValueFields.js +4 -4
  79. package/dist/widgets/OrgChart.js +4 -3
  80. package/dist/widgets/OrgChartBoard.d.ts +93 -4
  81. package/dist/widgets/OrgChartBoard.js +9 -6
  82. package/dist/widgets/PeriodFilter.js +4 -4
  83. package/dist/widgets/PermissionMatrixEditor.d.ts +16 -0
  84. package/dist/widgets/PermissionMatrixEditor.js +4 -4
  85. package/dist/widgets/PositionSelect.d.ts +6 -1
  86. package/dist/widgets/PositionSelect.js +5 -4
  87. package/dist/widgets/PrintSheet.js +3 -3
  88. package/dist/widgets/ProfileEditDiffCard.d.ts +6 -0
  89. package/dist/widgets/ProfileEditDiffCard.js +4 -4
  90. package/dist/widgets/QRDisplay.js +4 -4
  91. package/dist/widgets/RankBoard.d.ts +6 -0
  92. package/dist/widgets/RankBoard.js +6 -5
  93. package/dist/widgets/RecordSheet.js +2 -2
  94. package/dist/widgets/RoleMemberPicker.d.ts +11 -5
  95. package/dist/widgets/RoleMemberPicker.js +5 -4
  96. package/dist/widgets/SearchableMultiPicker.js +5 -5
  97. package/dist/widgets/SecureScreen.d.ts +12 -0
  98. package/dist/widgets/SecureScreen.js +3 -3
  99. package/dist/widgets/StackedMeter.js +2 -2
  100. package/dist/widgets/StagePeriodEditor.js +4 -5
  101. package/dist/widgets/Strip.js +2 -2
  102. package/dist/widgets/SummaryTable.js +2 -2
  103. package/dist/widgets/TagMultiSelect.d.ts +0 -1
  104. package/dist/widgets/TagMultiSelect.js +4 -4
  105. package/dist/widgets/Timeline.js +4 -4
  106. package/dist/widgets/TreePicker.js +6 -6
  107. package/dist/widgets/TreeView.js +5 -5
  108. package/dist/widgets/index.d.ts +3 -3
  109. package/dist/widgets/index.js +81 -79
  110. package/package.json +1 -1
  111. package/dist/chunk-EKVA7T7P.js +0 -198
@@ -0,0 +1,111 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+
3
+ // src/widgets/usePanZoomCanvas.ts
4
+ var MIN_ZOOM = 0.35;
5
+ var MAX_ZOOM = 1.8;
6
+ var clamp = (value, min, max) => Math.min(max, Math.max(min, value));
7
+ function applyZoom(current, nextScale, focal) {
8
+ const scale = clamp(nextScale, MIN_ZOOM, MAX_ZOOM);
9
+ return {
10
+ scale,
11
+ x: focal.x - (focal.x - current.x) / current.scale * scale,
12
+ y: focal.y - (focal.y - current.y) / current.scale * scale
13
+ };
14
+ }
15
+ function usePanZoomCanvas(options) {
16
+ const { stopSelector, initialView } = options;
17
+ const viewportRef = useRef(null);
18
+ const dragRef = useRef(null);
19
+ const [view, setView] = useState(initialView);
20
+ const [dragging, setDragging] = useState(false);
21
+ const [isFullscreen, setIsFullscreen] = useState(false);
22
+ useEffect(() => {
23
+ const handleFullscreenChange = () => {
24
+ setIsFullscreen(document.fullscreenElement === viewportRef.current);
25
+ };
26
+ document.addEventListener("fullscreenchange", handleFullscreenChange);
27
+ return () => document.removeEventListener("fullscreenchange", handleFullscreenChange);
28
+ }, []);
29
+ useEffect(() => {
30
+ const viewport = viewportRef.current;
31
+ if (!viewport) return;
32
+ const onWheel = (event) => {
33
+ event.preventDefault();
34
+ const rect = viewport.getBoundingClientRect();
35
+ const focal = { x: event.clientX - rect.left, y: event.clientY - rect.top };
36
+ setView(
37
+ (current) => applyZoom(current, current.scale * (event.deltaY > 0 ? 0.9 : 1.1), focal)
38
+ );
39
+ };
40
+ viewport.addEventListener("wheel", onWheel, { passive: false });
41
+ return () => viewport.removeEventListener("wheel", onWheel);
42
+ }, []);
43
+ const viewportCenter = useCallback(() => {
44
+ const rect = viewportRef.current?.getBoundingClientRect();
45
+ if (!rect) return { x: 0, y: 0 };
46
+ return { x: rect.width / 2, y: rect.height / 2 };
47
+ }, []);
48
+ const zoomAt = useCallback((nextScale, focal) => {
49
+ setView((current) => applyZoom(current, nextScale, focal));
50
+ }, []);
51
+ const handlePointerDown = (event) => {
52
+ if (event.target.closest(stopSelector)) return;
53
+ dragRef.current = {
54
+ pointerId: event.pointerId,
55
+ startX: event.clientX,
56
+ startY: event.clientY,
57
+ originX: view.x,
58
+ originY: view.y
59
+ };
60
+ setDragging(true);
61
+ event.currentTarget.setPointerCapture(event.pointerId);
62
+ };
63
+ const handlePointerMove = (event) => {
64
+ const drag = dragRef.current;
65
+ if (!drag || drag.pointerId !== event.pointerId) return;
66
+ setView((current) => ({
67
+ ...current,
68
+ x: drag.originX + event.clientX - drag.startX,
69
+ y: drag.originY + event.clientY - drag.startY
70
+ }));
71
+ };
72
+ const handlePointerUp = (event) => {
73
+ if (dragRef.current?.pointerId !== event.pointerId) return;
74
+ dragRef.current = null;
75
+ setDragging(false);
76
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
77
+ event.currentTarget.releasePointerCapture(event.pointerId);
78
+ }
79
+ };
80
+ const toggleFullscreen = async () => {
81
+ const viewport = viewportRef.current;
82
+ if (!viewport) return;
83
+ try {
84
+ if (document.fullscreenElement === viewport) {
85
+ await document.exitFullscreen();
86
+ return;
87
+ }
88
+ await viewport.requestFullscreen();
89
+ } catch {
90
+ }
91
+ };
92
+ return {
93
+ viewportRef,
94
+ view,
95
+ setView,
96
+ dragging,
97
+ isFullscreen,
98
+ viewportCenter,
99
+ zoomAt,
100
+ toggleFullscreen,
101
+ /** 뷰포트 div에 그대로 spread — 패닝 4종 핸들러. */
102
+ pointerHandlers: {
103
+ onPointerDown: handlePointerDown,
104
+ onPointerMove: handlePointerMove,
105
+ onPointerUp: handlePointerUp,
106
+ onPointerCancel: handlePointerUp
107
+ }
108
+ };
109
+ }
110
+
111
+ export { MAX_ZOOM, MIN_ZOOM, usePanZoomCanvas };
@@ -1,7 +1,8 @@
1
- import { includesLooseSearch } from './chunk-VDBUXYEB.js';
2
- import { useSduiAdapter, hostFetchOf } from './chunk-DKPNFEVU.js';
3
- import { Icon, Button, Input, Spinner } from './chunk-TUOG7EEI.js';
4
- import { boxed } from './chunk-YQOMSWW5.js';
1
+ import { ellipsisStyle, unwrapRows } from './chunk-Q4SWUINA.js';
2
+ import { includesLooseSearch } from './chunk-WOYMEEPH.js';
3
+ import { useSduiAdapter, hostFetchOf } from './chunk-KO6OEY3G.js';
4
+ import { Icon, Button, Input, Spinner } from './chunk-RNOUXUBO.js';
5
+ import { boxed } from './chunk-5WW4MBRO.js';
5
6
  import { useId, useRef, useMemo, useState, useEffect } from 'react';
6
7
  import { jsxs, jsx } from 'react/jsx-runtime';
7
8
 
@@ -19,18 +20,8 @@ function endpointSearchFn(endpoint, searchParam, hostFetch) {
19
20
  }
20
21
  };
21
22
  }
22
- function isRecord(value) {
23
- return typeof value === "object" && value !== null && !Array.isArray(value);
24
- }
25
23
  function toAutocompleteOptions(payload) {
26
- if (Array.isArray(payload)) return payload.filter(isRecord);
27
- if (isRecord(payload)) {
28
- for (const key of ["items", "data", "results", "rows"]) {
29
- const inner = payload[key];
30
- if (Array.isArray(inner)) return inner.filter(isRecord);
31
- }
32
- }
33
- return [];
24
+ return unwrapRows(payload);
34
25
  }
35
26
  function pickText(option, key) {
36
27
  if (!key) return "";
@@ -38,12 +29,6 @@ function pickText(option, key) {
38
29
  if (raw === null || raw === void 0) return "";
39
30
  return String(raw);
40
31
  }
41
- var ellipsisStyle = {
42
- display: "block",
43
- overflow: "hidden",
44
- textOverflow: "ellipsis",
45
- whiteSpace: "nowrap"
46
- };
47
32
  var statusRowStyle = {
48
33
  padding: "var(--wp-space-2) var(--wp-space-3)"
49
34
  };
@@ -1,7 +1,7 @@
1
- import { ImageLightbox } from './chunk-KYGSMUUU.js';
2
- import { useSduiSandbox, useSduiAdapter, hostRawFetchOf, defaultAdapter, useSduiAssetResolver } from './chunk-DKPNFEVU.js';
3
- import { Spinner, Icon, IconButton } from './chunk-TUOG7EEI.js';
4
- import { boxed } from './chunk-YQOMSWW5.js';
1
+ import { ImageLightbox } from './chunk-VY7MVBSE.js';
2
+ import { useSduiSandbox, useSduiAdapter, hostRawFetchOf, defaultAdapter, useSduiAssetResolver } from './chunk-KO6OEY3G.js';
3
+ import { Spinner, Icon, IconButton } from './chunk-RNOUXUBO.js';
4
+ import { boxed } from './chunk-5WW4MBRO.js';
5
5
  import { useState, useRef, useEffect, useCallback } from 'react';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
7
 
@@ -58,7 +58,7 @@ function FileDropzoneImpl({
58
58
  const [busy, setBusy] = useState(false);
59
59
  const [progress, setProgress] = useState(null);
60
60
  const [warnings, setWarnings] = useState([]);
61
- const [localMode, setLocalMode] = useState(!endpoint);
61
+ const [localMode, setLocalMode] = useState(!endpoint && !upload);
62
62
  const [dragOver, setDragOver] = useState(false);
63
63
  const [hovering, setHovering] = useState(false);
64
64
  const [hoverItemId, setHoverItemId] = useState(null);
@@ -84,7 +84,7 @@ function FileDropzoneImpl({
84
84
  setBusy(true);
85
85
  onBusyChange?.(true);
86
86
  const failures = [];
87
- let local = localMode || !endpoint || sandbox || !canUpload;
87
+ let local = localMode || !endpoint && !upload || sandbox || !canUpload;
88
88
  try {
89
89
  for (let index = 0; index < queue.length; index += 1) {
90
90
  const file = queue[index];
@@ -201,7 +201,7 @@ function FileDropzoneImpl({
201
201
  }
202
202
  forget();
203
203
  },
204
- [commit, deleteEndpoint, onRemove]
204
+ [commit, deleteEndpoint, onRemove, rawFetch]
205
205
  );
206
206
  const openPicker = () => {
207
207
  if (canAdd) inputRef.current?.click();
@@ -1,4 +1,4 @@
1
- import { boxed } from './chunk-YQOMSWW5.js';
1
+ import { boxed } from './chunk-5WW4MBRO.js';
2
2
  import { useState } from 'react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
 
@@ -0,0 +1,51 @@
1
+ import { isPlainObject } from './chunk-RNOUXUBO.js';
2
+
3
+ // src/widgets/shared.ts
4
+ function unwrapRows(payload) {
5
+ if (Array.isArray(payload)) return payload.filter(isPlainObject);
6
+ if (isPlainObject(payload)) {
7
+ for (const key of ["items", "data", "results", "rows"]) {
8
+ const inner = payload[key];
9
+ if (Array.isArray(inner)) return inner.filter(isPlainObject);
10
+ }
11
+ }
12
+ return [];
13
+ }
14
+ var PAGE_SIZE = 500;
15
+ var MAX_PAGES = 20;
16
+ async function fetchAllPages(api, endpoint, pick) {
17
+ const all = [];
18
+ const sep = endpoint.includes("?") ? "&" : "?";
19
+ for (let page = 0; page < MAX_PAGES; page += 1) {
20
+ const body = await api(`${endpoint}${sep}limit=${PAGE_SIZE}&offset=${page * PAGE_SIZE}`, {
21
+ method: "GET"
22
+ });
23
+ const rows = pick(body ?? {});
24
+ all.push(...rows);
25
+ const total = typeof body?.total === "number" ? body.total : null;
26
+ if (rows.length === 0) break;
27
+ if (total !== null ? all.length >= total : rows.length < PAGE_SIZE) break;
28
+ }
29
+ return all;
30
+ }
31
+ var uidCounter = 0;
32
+ var uid = (prefix) => `${prefix}-${Date.now()}-${++uidCounter}`;
33
+ var orderCircleStyle = {
34
+ display: "inline-flex",
35
+ alignItems: "center",
36
+ justifyContent: "center",
37
+ width: 28,
38
+ height: 28,
39
+ flex: "none",
40
+ borderRadius: "var(--wp-radius-pill)",
41
+ background: "var(--wp-surface-brand-tint)",
42
+ color: "var(--wp-text-brand)"
43
+ };
44
+ var ellipsisStyle = {
45
+ display: "block",
46
+ overflow: "hidden",
47
+ textOverflow: "ellipsis",
48
+ whiteSpace: "nowrap"
49
+ };
50
+
51
+ export { ellipsisStyle, fetchAllPages, orderCircleStyle, uid, unwrapRows };