@wipco/sdui 1.8.3 → 1.9.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 (82) hide show
  1. package/dist/{chunk-H7RLEDKJ.js → chunk-35GI6LM5.js} +2 -2
  2. package/dist/{chunk-YJJMK5R5.js → chunk-3L4EXK3X.js} +2 -2
  3. package/dist/{chunk-LGKLA22B.js → chunk-3XUHKSJM.js} +1 -1
  4. package/dist/{chunk-KIHN7DGA.js → chunk-45GIMFRP.js} +208 -6
  5. package/dist/{chunk-TCHXA35K.js → chunk-5DLUGN5M.js} +2 -2
  6. package/dist/{chunk-TK3WS7XE.js → chunk-5N4ESLPX.js} +2 -2
  7. package/dist/{chunk-O3SD2HS6.js → chunk-77OM6OQG.js} +1 -1
  8. package/dist/{chunk-PN5IJPA5.js → chunk-7NQBV77N.js} +1 -1
  9. package/dist/{chunk-LONXOEZY.js → chunk-BBA7KKG4.js} +1 -1
  10. package/dist/{chunk-DNUO63VZ.js → chunk-BOL536MN.js} +2 -2
  11. package/dist/{chunk-PGAP2RLS.js → chunk-BT5P3DW6.js} +1 -1
  12. package/dist/{chunk-WW65XEEE.js → chunk-CBY6ACMR.js} +2 -2
  13. package/dist/{chunk-OI2GPBIL.js → chunk-CRSNVEUE.js} +2 -2
  14. package/dist/{chunk-XFNHHGFR.js → chunk-DE7FPWVJ.js} +1 -1
  15. package/dist/{chunk-ITFSPOOB.js → chunk-EH5QJJQE.js} +1 -1
  16. package/dist/{chunk-CFFSCGDV.js → chunk-FPEOYSK4.js} +3 -3
  17. package/dist/{chunk-UNQ6VAVD.js → chunk-FVONSLW3.js} +2 -2
  18. package/dist/{chunk-FXEKHHEA.js → chunk-GAABHPGR.js} +1 -1
  19. package/dist/{chunk-KJDHF6VU.js → chunk-HNMBEUBO.js} +1 -1
  20. package/dist/{chunk-YOLT2TPX.js → chunk-HR2U2QGN.js} +1 -1
  21. package/dist/{chunk-5JXXCRXA.js → chunk-KMNC3Q4J.js} +2 -2
  22. package/dist/{chunk-HAK2YXSF.js → chunk-LRDGT4T4.js} +1 -1
  23. package/dist/{chunk-K7K6WOIG.js → chunk-M4CZZMZJ.js} +3 -3
  24. package/dist/{chunk-ZDWCLHIY.js → chunk-MBROAHA6.js} +5 -5
  25. package/dist/{chunk-37CLBWCE.js → chunk-MLWNI4HI.js} +1 -1
  26. package/dist/{chunk-B6U2YWUP.js → chunk-MY7VBYHI.js} +2 -2
  27. package/dist/{chunk-6TWP3E2L.js → chunk-NP4VOH2M.js} +3 -3
  28. package/dist/{chunk-YK7ZNV2C.js → chunk-PPOQY3V5.js} +1 -1
  29. package/dist/{chunk-CUAGMSSG.js → chunk-Q6V7E2H5.js} +1 -1
  30. package/dist/{chunk-I2URQNZZ.js → chunk-QDCP6P3K.js} +9 -7
  31. package/dist/{chunk-DTCZPXOT.js → chunk-QHSUTI55.js} +199 -21
  32. package/dist/{chunk-DDX7KJAW.js → chunk-QZMMW3JC.js} +1 -1
  33. package/dist/{chunk-JDTVNS3H.js → chunk-S4CQTJC6.js} +1 -1
  34. package/dist/{chunk-JRCHWX2B.js → chunk-T5ZHEXGK.js} +1 -1
  35. package/dist/{chunk-3PGKBTBZ.js → chunk-TVJS5JAK.js} +2 -2
  36. package/dist/{chunk-QP7AQEGZ.js → chunk-VGWOOPHH.js} +3 -3
  37. package/dist/{chunk-ZW42VDR3.js → chunk-WIQIJDEC.js} +1 -1
  38. package/dist/{chunk-TQV4M3SB.js → chunk-WS3QZIYN.js} +2 -2
  39. package/dist/{chunk-AMKIMOTU.js → chunk-WZS7KYOS.js} +2 -2
  40. package/dist/{chunk-UDJVLMDH.js → chunk-YSRJPBMO.js} +2 -2
  41. package/dist/{chunk-KVQXQLAP.js → chunk-ZAESY6NX.js} +2 -2
  42. package/dist/{chunk-4SVSS7VO.js → chunk-ZSKQUIYR.js} +4 -4
  43. package/dist/index.d.ts +40 -5
  44. package/dist/index.js +16 -16
  45. package/dist/meta.js +59 -6
  46. package/dist/rich/ExcelUploadCard.js +3 -3
  47. package/dist/rich.js +5 -5
  48. package/dist/widgets/ApprovalLineEditor.js +7 -7
  49. package/dist/widgets/ApprovalOverridesEditor.js +9 -9
  50. package/dist/widgets/ApprovalStepper.js +2 -2
  51. package/dist/widgets/AutocompleteField.d.ts +29 -3
  52. package/dist/widgets/AutocompleteField.js +7 -7
  53. package/dist/widgets/ColumnBoard.js +2 -2
  54. package/dist/widgets/DiffView.js +2 -2
  55. package/dist/widgets/Disclosure.js +2 -2
  56. package/dist/widgets/EventCalendar.js +3 -3
  57. package/dist/widgets/FileDropzone.js +5 -5
  58. package/dist/widgets/ImageLightbox.js +3 -3
  59. package/dist/widgets/InlineEdit.js +2 -2
  60. package/dist/widgets/JsonField.js +2 -2
  61. package/dist/widgets/OptionSchemaEditor.js +3 -3
  62. package/dist/widgets/OptionValueFields.js +3 -3
  63. package/dist/widgets/OrgChart.js +2 -2
  64. package/dist/widgets/OrgChartBoard.js +5 -5
  65. package/dist/widgets/PeriodFilter.js +4 -4
  66. package/dist/widgets/PermissionMatrixEditor.js +3 -3
  67. package/dist/widgets/PositionSelect.js +3 -3
  68. package/dist/widgets/PrintSheet.js +2 -2
  69. package/dist/widgets/ProfileEditDiffCard.js +3 -3
  70. package/dist/widgets/QRDisplay.js +3 -3
  71. package/dist/widgets/RankBoard.js +4 -4
  72. package/dist/widgets/RoleMemberPicker.js +4 -4
  73. package/dist/widgets/SearchableMultiPicker.js +5 -5
  74. package/dist/widgets/SecureScreen.js +2 -2
  75. package/dist/widgets/StagePeriodEditor.js +4 -4
  76. package/dist/widgets/TagInput.js +2 -2
  77. package/dist/widgets/TagMultiSelect.js +3 -3
  78. package/dist/widgets/Timeline.js +3 -3
  79. package/dist/widgets/TreePicker.js +6 -6
  80. package/dist/widgets/TreeView.js +5 -5
  81. package/dist/widgets/index.js +71 -71
  82. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { includesLooseSearch } from './chunk-I2URQNZZ.js';
1
+ import { includesLooseSearch } from './chunk-QDCP6P3K.js';
2
2
  import { OverlayLayer } from './chunk-R2ORCOTG.js';
3
- import { Button, Dialog, Input, Tag, Checkbox } from './chunk-KIHN7DGA.js';
3
+ import { Button, Dialog, Input, Tag, Checkbox } from './chunk-45GIMFRP.js';
4
4
  import { boxed } from './chunk-3JTBOABA.js';
5
5
  import React, { useMemo, useState } from 'react';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- import { Disclosure } from './chunk-LONXOEZY.js';
2
- import { Icon } from './chunk-KIHN7DGA.js';
1
+ import { Disclosure } from './chunk-BBA7KKG4.js';
2
+ import { Icon } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
@@ -1,4 +1,4 @@
1
- import { Button } from './chunk-KIHN7DGA.js';
1
+ import { Button } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useEffect, useState } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1268,6 +1268,92 @@ var ICON_NODES = {
1268
1268
  { t: "line", x1: "8", x2: "14", y1: "11", y2: "11" }
1269
1269
  ]
1270
1270
  };
1271
+
1272
+ // src/number-text.ts
1273
+ function halfWidth(ch) {
1274
+ const code = ch.charCodeAt(0);
1275
+ if (code >= 65296 && code <= 65305) return String.fromCharCode(code - 65296 + 48);
1276
+ if (code === 65294) return ".";
1277
+ if (code === 65293 || code === 8722) return "-";
1278
+ return ch;
1279
+ }
1280
+ function sanitizeNumberText(text) {
1281
+ let out = "";
1282
+ let dot = false;
1283
+ for (const raw of text) {
1284
+ const ch = halfWidth(raw);
1285
+ if (ch >= "0" && ch <= "9") {
1286
+ if (!dot && (out === "0" || out === "-0")) out = out.slice(0, -1);
1287
+ out += ch;
1288
+ } else if (ch === "." && !dot) {
1289
+ dot = true;
1290
+ out += ch;
1291
+ } else if (ch === "-" && out === "") out += ch;
1292
+ }
1293
+ return out;
1294
+ }
1295
+ function groupNumberText(clean) {
1296
+ const negative = clean.startsWith("-");
1297
+ const body = negative ? clean.slice(1) : clean;
1298
+ const dotAt = body.indexOf(".");
1299
+ const integer = dotAt === -1 ? body : body.slice(0, dotAt);
1300
+ const tail = dotAt === -1 ? "" : body.slice(dotAt);
1301
+ return `${negative ? "-" : ""}${integer.replace(/\B(?=(\d{3})+(?!\d))/g, ",")}${tail}`;
1302
+ }
1303
+ function parseNumberText(clean) {
1304
+ if (!/\d/.test(clean)) return null;
1305
+ const n = Number(clean);
1306
+ if (!Number.isFinite(n)) return null;
1307
+ return n === 0 ? 0 : n;
1308
+ }
1309
+ function plainNumberText(value) {
1310
+ if (!Number.isFinite(value)) return "";
1311
+ const text = String(value === 0 ? 0 : value);
1312
+ if (!/e/i.test(text)) return text;
1313
+ return value.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 20 });
1314
+ }
1315
+ function numberInputValue(value) {
1316
+ if (typeof value === "number") return Number.isFinite(value) ? value === 0 ? 0 : value : null;
1317
+ if (typeof value !== "string") return null;
1318
+ const plain = value.replace(/,/g, "").trim();
1319
+ if (/^[+-]?(\d+(\.\d*)?|\.\d+)$/.test(plain)) return parseNumberText(plain.replace(/^\+/, ""));
1320
+ return parseNumberText(sanitizeNumberText(value));
1321
+ }
1322
+ function formatNumberInputValue(value) {
1323
+ const n = numberInputValue(value);
1324
+ return n === null ? "" : groupNumberText(plainNumberText(n));
1325
+ }
1326
+ function significantBefore(text, caret) {
1327
+ return sanitizeNumberText(text.slice(0, Math.max(0, caret))).length;
1328
+ }
1329
+ function caretAfterSignificant(formatted, count) {
1330
+ if (count <= 0) return 0;
1331
+ let seen = 0;
1332
+ for (let i = 0; i < formatted.length; i += 1) {
1333
+ if (formatted[i] === ",") continue;
1334
+ seen += 1;
1335
+ if (seen === count) return i + 1;
1336
+ }
1337
+ return formatted.length;
1338
+ }
1339
+ function editNumberText(raw, caret, previous, inputType) {
1340
+ let source = raw;
1341
+ let at = Math.max(0, Math.min(caret, raw.length));
1342
+ if (previous !== void 0 && raw.length === previous.length - 1 && previous[at] === "," && raw === previous.slice(0, at) + previous.slice(at + 1)) {
1343
+ if (inputType === "deleteContentForward") {
1344
+ source = previous.slice(0, at + 1) + previous.slice(at + 2);
1345
+ } else if (at > 0) {
1346
+ source = previous.slice(0, at - 1) + previous.slice(at);
1347
+ at -= 1;
1348
+ }
1349
+ }
1350
+ const clean = sanitizeNumberText(source);
1351
+ const text = groupNumberText(clean);
1352
+ return { text, caret: caretAfterSignificant(text, significantBefore(source, at)), value: parseNumberText(clean) };
1353
+ }
1354
+ function sameNumberValue(a, b) {
1355
+ return a === b;
1356
+ }
1271
1357
  function asArray(value) {
1272
1358
  return Array.isArray(value) ? value : [];
1273
1359
  }
@@ -1367,23 +1453,139 @@ function IconButton({
1367
1453
  }
1368
1454
  );
1369
1455
  }
1370
- function Input({ size = "md", icon, invalid = false, mono = false, trailing, className = "", style, ...rest }) {
1456
+ function unitPaddingRight(unit) {
1457
+ let width = 0;
1458
+ for (const ch of unit) {
1459
+ if (/[\u1100-\u11ff\u3000-\u9fff\uac00-\ud7af\uff00-\uffef]/.test(ch)) width += 12;
1460
+ else if (/[A-Z%@#&WM]/.test(ch)) width += 9;
1461
+ else if (ch === " ") width += 3.5;
1462
+ else width += 7;
1463
+ }
1464
+ return `${Math.ceil(width + 18)}px`;
1465
+ }
1466
+ function Input(props) {
1467
+ const {
1468
+ size = "md",
1469
+ icon,
1470
+ invalid = false,
1471
+ mono = false,
1472
+ trailing,
1473
+ unit,
1474
+ thousands,
1475
+ className = "",
1476
+ style,
1477
+ ...rest
1478
+ } = props;
1371
1479
  const classes = ["wp-input"];
1372
1480
  if (size !== "md") classes.push(`wp-input--${size}`);
1373
1481
  if (invalid) classes.push("wp-input--invalid");
1374
1482
  if (mono) classes.push("wp-input--mono");
1375
1483
  if (className) classes.push(className);
1376
- const input = /* @__PURE__ */ jsx("input", { className: classes.join(" "), "aria-invalid": invalid || void 0, style, ...rest });
1377
- if (!icon && !trailing) return input;
1484
+ const unitText = unit === void 0 || unit === null || String(unit) === "" ? void 0 : String(unit);
1485
+ if (unitText !== void 0 && trailing) {
1486
+ warnOnce("input:unit+trailing", "[sdui] Input: unit \uACFC trailing \uC744 \uD568\uAED8 \uC8FC\uBA74 unit \uB9CC \uADF8\uB9BD\uB2C8\uB2E4");
1487
+ }
1488
+ const inputStyle = unitText !== void 0 ? { paddingRight: unitPaddingRight(unitText), ...style } : style;
1489
+ const input = thousands ? /* @__PURE__ */ jsx(
1490
+ ThousandsInput,
1491
+ {
1492
+ className: classes.join(" "),
1493
+ "aria-invalid": invalid || void 0,
1494
+ style: inputStyle,
1495
+ ...rest
1496
+ }
1497
+ ) : /* @__PURE__ */ jsx(
1498
+ "input",
1499
+ {
1500
+ className: classes.join(" "),
1501
+ "aria-invalid": invalid || void 0,
1502
+ style: inputStyle,
1503
+ ...rest
1504
+ }
1505
+ );
1506
+ const trail = unitText !== void 0 ? /* @__PURE__ */ jsx(
1507
+ "span",
1508
+ {
1509
+ className: "wp-inputwrap__trail",
1510
+ "data-unit": "",
1511
+ style: { fontSize: "var(--wp-size-xs)", color: "var(--wp-text-muted)", whiteSpace: "nowrap", lineHeight: 1 },
1512
+ children: unitText
1513
+ }
1514
+ ) : trailing ? /* @__PURE__ */ jsx("span", { className: "wp-inputwrap__trail", children: typeof trailing === "string" ? /* @__PURE__ */ jsx(Icon, { name: trailing, size: 15 }) : trailing }) : null;
1515
+ if (!icon && !trail) return input;
1378
1516
  const wrap = ["wp-inputwrap"];
1379
1517
  if (icon) wrap.push("wp-inputwrap--lead");
1380
- if (trailing) wrap.push("wp-inputwrap--trail");
1518
+ if (trail) wrap.push("wp-inputwrap--trail");
1381
1519
  return /* @__PURE__ */ jsxs("div", { className: wrap.join(" "), children: [
1382
1520
  icon ? /* @__PURE__ */ jsx("span", { className: "wp-inputwrap__lead", children: /* @__PURE__ */ jsx(Icon, { name: icon, size: 15 }) }) : null,
1383
1521
  input,
1384
- trailing ? /* @__PURE__ */ jsx("span", { className: "wp-inputwrap__trail", children: typeof trailing === "string" ? /* @__PURE__ */ jsx(Icon, { name: trailing, size: 15 }) : trailing }) : null
1522
+ trail
1385
1523
  ] });
1386
1524
  }
1525
+ function ThousandsInput({
1526
+ value,
1527
+ defaultValue,
1528
+ onChange,
1529
+ onBlur,
1530
+ type: _type,
1531
+ min: _min,
1532
+ max: _max,
1533
+ step: _step,
1534
+ inputMode,
1535
+ autoComplete,
1536
+ ...rest
1537
+ }) {
1538
+ const controlled = value !== void 0;
1539
+ const [own, setOwn] = React.useState(() => numberInputValue(defaultValue));
1540
+ const external = controlled ? numberInputValue(value) : own;
1541
+ const [draft, setDraft] = React.useState(null);
1542
+ const [seen, setSeen] = React.useState(external);
1543
+ let shown = draft;
1544
+ if (!sameNumberValue(seen, external)) {
1545
+ setSeen(external);
1546
+ if (draft !== null && !sameNumberValue(parseNumberText(sanitizeNumberText(draft)), external)) {
1547
+ setDraft(null);
1548
+ shown = null;
1549
+ }
1550
+ }
1551
+ const display = shown ?? formatNumberInputValue(controlled ? value : own);
1552
+ const handleChange = (event) => {
1553
+ const el = event.target;
1554
+ const inputType = event.nativeEvent.inputType;
1555
+ const next = editNumberText(
1556
+ el.value,
1557
+ el.selectionStart ?? el.value.length,
1558
+ display,
1559
+ typeof inputType === "string" ? inputType : void 0
1560
+ );
1561
+ if (el.value !== next.text) el.value = next.text;
1562
+ if (el.ownerDocument.activeElement === el) {
1563
+ try {
1564
+ el.setSelectionRange(next.caret, next.caret);
1565
+ } catch {
1566
+ }
1567
+ }
1568
+ setDraft(next.text);
1569
+ if (next.text === display) return;
1570
+ if (!controlled) setOwn(next.value);
1571
+ onChange?.(next.value);
1572
+ };
1573
+ return /* @__PURE__ */ jsx(
1574
+ "input",
1575
+ {
1576
+ ...rest,
1577
+ type: "text",
1578
+ inputMode: inputMode ?? "decimal",
1579
+ autoComplete: autoComplete ?? "off",
1580
+ value: display,
1581
+ onChange: handleChange,
1582
+ onBlur: (event) => {
1583
+ setDraft(null);
1584
+ onBlur?.(event);
1585
+ }
1586
+ }
1587
+ );
1588
+ }
1387
1589
  function Textarea({ invalid = false, rows = 3, className = "", ...rest }) {
1388
1590
  return /* @__PURE__ */ jsx(
1389
1591
  "textarea",
@@ -2039,4 +2241,4 @@ function Tooltip({ label, shortcut, placement = "top", wrap = false, children, c
2039
2241
  );
2040
2242
  }
2041
2243
 
2042
- export { Alert, Avatar, Badge, Breadcrumb, Button, CALC_OPS, Card, Checkbox, Dialog, EmptyState, Field, ICON_NODES, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip, evaluateCalc, fieldOf, formatDateValue, formatDisplayValue, formatNumberValue, isPlainObject, isZonedIsoDateTime, parseNumeric, toNumber, warnOnce };
2244
+ export { Alert, Avatar, Badge, Breadcrumb, Button, CALC_OPS, Card, Checkbox, Dialog, EmptyState, Field, ICON_NODES, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip, evaluateCalc, fieldOf, formatDateValue, formatDisplayValue, formatNumberValue, isPlainObject, isZonedIsoDateTime, parseNumeric, plainNumberText, toNumber, warnOnce };
@@ -1,5 +1,5 @@
1
- import { useSduiAdapter, hostFetchOf } from './chunk-XFNHHGFR.js';
2
- import { Badge, Tag } from './chunk-KIHN7DGA.js';
1
+ import { useSduiAdapter, hostFetchOf } from './chunk-DE7FPWVJ.js';
2
+ import { Badge, Tag } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useRef, useEffect, useMemo, useState } from 'react';
5
5
  import { jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- import { Text } from './chunk-YK7ZNV2C.js';
2
- import { Switch, Field, Select, Input } from './chunk-KIHN7DGA.js';
1
+ import { Text } from './chunk-PPOQY3V5.js';
2
+ import { Switch, Field, Select, Input } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import React, { useMemo } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { OverlayLayer } from './chunk-R2ORCOTG.js';
2
- import { Dialog, Button, warnOnce } from './chunk-KIHN7DGA.js';
2
+ import { Dialog, Button, warnOnce } from './chunk-45GIMFRP.js';
3
3
  import { createContext, useContext, useMemo, useRef, useCallback, useState } from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { useOverlayLayer, OverlayContainerContext, getOverlayRoot } from './chunk-R2ORCOTG.js';
2
- import { IconButton } from './chunk-KIHN7DGA.js';
2
+ import { IconButton } from './chunk-45GIMFRP.js';
3
3
  import { useState, useRef, useCallback, useEffect, useContext } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { Icon } from './chunk-KIHN7DGA.js';
1
+ import { Icon } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useState, useId, useCallback } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,7 +1,7 @@
1
1
  import { HoistedStyle } from './chunk-RIZRM7OO.js';
2
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-XFNHHGFR.js';
2
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-DE7FPWVJ.js';
3
3
  import { MOBILE_MEDIA_QUERY } from './chunk-TAVKGYH5.js';
4
- import { Icon, Badge, Checkbox, Select, Button } from './chunk-KIHN7DGA.js';
4
+ import { Icon, Badge, Checkbox, Select, Button } from './chunk-45GIMFRP.js';
5
5
  import { boxed } from './chunk-3JTBOABA.js';
6
6
  import { useRef, useEffect, useState, useMemo } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { Textarea, Icon } from './chunk-KIHN7DGA.js';
1
+ import { Textarea, Icon } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useState, useRef, useId, useEffect, useCallback } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-XFNHHGFR.js';
2
- import { Spinner, Badge, Icon } from './chunk-KIHN7DGA.js';
1
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-DE7FPWVJ.js';
2
+ import { Spinner, Badge, Icon } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useEffect } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- import { buildCascadingTree } from './chunk-I2URQNZZ.js';
2
- import { Input, IconButton, EmptyState, Icon, Badge } from './chunk-KIHN7DGA.js';
1
+ import { buildCascadingTree } from './chunk-QDCP6P3K.js';
2
+ import { Input, IconButton, EmptyState, Icon, Badge } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import React, { useMemo, useState, useRef, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { DEV } from './chunk-TAVKGYH5.js';
2
- import { warnOnce } from './chunk-KIHN7DGA.js';
2
+ import { warnOnce } from './chunk-45GIMFRP.js';
3
3
  import { createContext, useContext } from 'react';
4
4
 
5
5
  function isSafeNavigationTarget(to) {
@@ -1,4 +1,4 @@
1
- import { Icon } from './chunk-KIHN7DGA.js';
1
+ import { Icon } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useRef, useState, useEffect } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
- import { ImageLightbox } from './chunk-JDTVNS3H.js';
2
- import { useSduiSandbox, useSduiAdapter, hostRawFetchOf, defaultAdapter, useSduiAssetResolver } from './chunk-XFNHHGFR.js';
3
- import { Spinner, Icon, IconButton } from './chunk-KIHN7DGA.js';
1
+ import { ImageLightbox } from './chunk-S4CQTJC6.js';
2
+ import { useSduiSandbox, useSduiAdapter, hostRawFetchOf, defaultAdapter, useSduiAssetResolver } from './chunk-DE7FPWVJ.js';
3
+ import { Spinner, Icon, IconButton } from './chunk-45GIMFRP.js';
4
4
  import { boxed } from './chunk-3JTBOABA.js';
5
5
  import { useState, useRef, useEffect, useCallback } from 'react';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- import { DateRangePicker } from './chunk-5JXXCRXA.js';
2
- import { SegmentedControl, Select } from './chunk-KIHN7DGA.js';
1
+ import { DateRangePicker } from './chunk-KMNC3Q4J.js';
2
+ import { SegmentedControl, Select } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useMemo } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { IconButton, Input } from './chunk-KIHN7DGA.js';
1
+ import { IconButton, Input } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useState, useRef, useEffect, useCallback } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  import { OverlayContainerContext, getOverlayRoot, useOverlayLayer } from './chunk-R2ORCOTG.js';
2
2
  import { HoistedStyle } from './chunk-RIZRM7OO.js';
3
- import { IconButton } from './chunk-KIHN7DGA.js';
3
+ import { IconButton } from './chunk-45GIMFRP.js';
4
4
  import React2, { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
  import { createPortal } from 'react-dom';
@@ -1,4 +1,4 @@
1
- import { isPlainObject } from './chunk-KIHN7DGA.js';
1
+ import { isPlainObject } from './chunk-45GIMFRP.js';
2
2
 
3
3
  // src/widgets/shared.ts
4
4
  function unwrapRows(payload) {
@@ -1,7 +1,7 @@
1
- import { KO_CALENDAR_NAV_LOCALE, useDismiss, usePopoverAnchor, usePortalTo, usePanelPointer, AnchoredPopoverStyles, anchorStyle, focusStaysInside, resolveCalendarNavLocale, CalendarZoom, CalendarNav, clampIndex } from './chunk-KJDHF6VU.js';
1
+ import { KO_CALENDAR_NAV_LOCALE, useDismiss, usePopoverAnchor, usePortalTo, usePanelPointer, AnchoredPopoverStyles, anchorStyle, focusStaysInside, resolveCalendarNavLocale, CalendarZoom, CalendarNav, clampIndex } from './chunk-HNMBEUBO.js';
2
2
  import { HoistedStyle } from './chunk-RIZRM7OO.js';
3
3
  import { useIsMobile } from './chunk-TAVKGYH5.js';
4
- import { Icon } from './chunk-KIHN7DGA.js';
4
+ import { Icon } from './chunk-45GIMFRP.js';
5
5
  import { boxed } from './chunk-3JTBOABA.js';
6
6
  import { useState, useRef, useEffect, useMemo, useCallback, useLayoutEffect } from 'react';
7
7
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { usePanZoomCanvas, MIN_ZOOM, MAX_ZOOM } from './chunk-XDR6HC4U.js';
2
- import { IconButton, Badge } from './chunk-KIHN7DGA.js';
2
+ import { IconButton, Badge } from './chunk-45GIMFRP.js';
3
3
  import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useMemo, useCallback, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,7 +1,7 @@
1
1
  import { fetchAllJobPositions } from './chunk-XRHR452N.js';
2
- import { useSduiDispatch, useSduiCan, SduiDialog } from './chunk-O3SD2HS6.js';
3
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-XFNHHGFR.js';
4
- import { Card, Input, Button, Icon, Badge, IconButton } from './chunk-KIHN7DGA.js';
2
+ import { useSduiDispatch, useSduiCan, SduiDialog } from './chunk-77OM6OQG.js';
3
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-DE7FPWVJ.js';
4
+ import { Card, Input, Button, Icon, Badge, IconButton } from './chunk-45GIMFRP.js';
5
5
  import { boxed } from './chunk-3JTBOABA.js';
6
6
  import React, { useState, useEffect, useCallback, useMemo } from 'react';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
- import { TagMultiSelect } from './chunk-TCHXA35K.js';
2
- import { ApprovalLineEditor, stepTypeIcon, stepLabel } from './chunk-4SVSS7VO.js';
3
- import { orderCircleStyle, unwrapRows, uid } from './chunk-YOLT2TPX.js';
4
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-XFNHHGFR.js';
5
- import { Card, Icon, Input, IconButton, Field, Button, Badge } from './chunk-KIHN7DGA.js';
1
+ import { TagMultiSelect } from './chunk-5DLUGN5M.js';
2
+ import { ApprovalLineEditor, stepTypeIcon, stepLabel } from './chunk-ZSKQUIYR.js';
3
+ import { orderCircleStyle, unwrapRows, uid } from './chunk-HR2U2QGN.js';
4
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-DE7FPWVJ.js';
5
+ import { Card, Icon, Input, IconButton, Field, Button, Badge } from './chunk-45GIMFRP.js';
6
6
  import { boxed } from './chunk-3JTBOABA.js';
7
7
  import React, { useRef, useState, useEffect } from 'react';
8
8
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { Icon, Badge, Tooltip } from './chunk-KIHN7DGA.js';
1
+ import { Icon, Badge, Tooltip } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import React from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  import { fetchAllJobPositions } from './chunk-XRHR452N.js';
2
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-XFNHHGFR.js';
3
- import { Select, Button } from './chunk-KIHN7DGA.js';
2
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-DE7FPWVJ.js';
3
+ import { Select, Button } from './chunk-45GIMFRP.js';
4
4
  import { boxed } from './chunk-3JTBOABA.js';
5
5
  import { useRef, useState, useEffect, useMemo } from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,9 +1,9 @@
1
1
  import { parseJobPositionRow } from './chunk-XRHR452N.js';
2
2
  import { MIN_ZOOM, usePanZoomCanvas } from './chunk-XDR6HC4U.js';
3
- import { ImageLightbox } from './chunk-JDTVNS3H.js';
4
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-XFNHHGFR.js';
3
+ import { ImageLightbox } from './chunk-S4CQTJC6.js';
4
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-DE7FPWVJ.js';
5
5
  import { useIsTabletDown } from './chunk-TAVKGYH5.js';
6
- import { warnOnce, Badge, Button, IconButton, Icon } from './chunk-KIHN7DGA.js';
6
+ import { warnOnce, Badge, Button, IconButton, Icon } from './chunk-45GIMFRP.js';
7
7
  import { boxed } from './chunk-3JTBOABA.js';
8
8
  import { useState, useMemo, useRef, useCallback, useEffect, useLayoutEffect } from 'react';
9
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { formatDisplayValue } from './chunk-KIHN7DGA.js';
1
+ import { formatDisplayValue } from './chunk-45GIMFRP.js';
2
2
  import { mergeStyle, containerLayoutStyle, joinClass, columnsClass, typographyStyle, GAP_CSS } from './chunk-3JTBOABA.js';
3
3
  import React from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { Badge, Checkbox, IconButton, Icon } from './chunk-KIHN7DGA.js';
1
+ import { Badge, Checkbox, IconButton, Icon } from './chunk-45GIMFRP.js';
2
2
  import { boxed } from './chunk-3JTBOABA.js';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1,7 +1,7 @@
1
- import { DateRangePicker } from './chunk-5JXXCRXA.js';
1
+ import { DateRangePicker } from './chunk-KMNC3Q4J.js';
2
2
  import { useOverlayLayer } from './chunk-R2ORCOTG.js';
3
3
  import { HoistedStyle } from './chunk-RIZRM7OO.js';
4
- import { Input, Button, IconButton, Tag, Field, Checkbox } from './chunk-KIHN7DGA.js';
4
+ import { Input, Button, IconButton, Tag, Field, Checkbox, plainNumberText, formatNumberValue } from './chunk-45GIMFRP.js';
5
5
  import { useRef, useEffect, useState, useMemo } from 'react';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
7
 
@@ -272,9 +272,10 @@ function activeSearchCriteria(fields, values) {
272
272
  const from = values[fromKey];
273
273
  const to = values[toKey];
274
274
  if (from || to) {
275
+ const show = (v) => field.type === "numberRange" ? formatNumberValue(v ?? "") : v ?? "";
275
276
  criteria.push({
276
277
  key: field.key,
277
- label: `${field.label}: ${from ?? ""}~${to ?? ""}`,
278
+ label: `${field.label}: ${show(from)}~${show(to)}`,
278
279
  clearKeys: [fromKey, toKey]
279
280
  });
280
281
  }
@@ -438,26 +439,27 @@ function SearchFieldInput({
438
439
  if (field.type === "numberRange") {
439
440
  const fromKey = field.fromKey ?? `${field.key}Min`;
440
441
  const toKey = field.toKey ?? `${field.key}Max`;
442
+ const store = (key) => (next) => onChange({ [key]: next === null ? "" : plainNumberText(next) });
441
443
  return /* @__PURE__ */ jsx(Field, { label: field.label, children: /* @__PURE__ */ jsxs("div", { className: "wp-row", children: [
442
444
  /* @__PURE__ */ jsx(
443
445
  Input,
444
446
  {
445
- type: "number",
447
+ thousands: true,
446
448
  mono: true,
447
449
  placeholder: field.minPlaceholder ?? "\uCD5C\uC18C",
448
450
  value: values[fromKey] ?? "",
449
- onChange: (e) => onChange({ [fromKey]: e.target.value })
451
+ onChange: store(fromKey)
450
452
  }
451
453
  ),
452
454
  /* @__PURE__ */ jsx("span", { className: "wp-caption", children: "~" }),
453
455
  /* @__PURE__ */ jsx(
454
456
  Input,
455
457
  {
456
- type: "number",
458
+ thousands: true,
457
459
  mono: true,
458
460
  placeholder: field.maxPlaceholder ?? "\uCD5C\uB300",
459
461
  value: values[toKey] ?? "",
460
- onChange: (e) => onChange({ [toKey]: e.target.value })
462
+ onChange: store(toKey)
461
463
  }
462
464
  )
463
465
  ] }) });