synapse-react-client 4.0.10 → 4.0.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 (89) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  3. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  4. package/dist/assets/icons/CloudWarning.js +47 -0
  5. package/dist/assets/icons/CloudWarning.js.map +1 -0
  6. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  7. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  8. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  9. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  10. package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
  11. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  12. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  13. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
  14. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  15. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  16. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  17. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  18. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  19. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  20. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  21. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  22. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  23. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  24. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  25. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  26. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  27. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  28. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  29. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  30. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  31. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  32. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  33. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  34. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  35. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  36. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  37. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  38. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  39. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  40. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  41. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  42. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  43. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  44. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  45. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  46. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  47. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  48. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  49. package/dist/components/Forum/DiscussionReply.js +19 -19
  50. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  51. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  52. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  53. package/dist/components/Forum/DiscussionThread.js +73 -72
  54. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  55. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  56. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  57. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  58. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  59. package/dist/components/IconSvg/IconSvg.js +2 -1
  60. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  61. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  62. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  63. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  64. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  65. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  66. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  67. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  68. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  69. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  70. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  71. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  72. package/dist/synapse-queries/KeyFactory.js +3 -0
  73. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  74. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  75. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  76. package/dist/synapse-queries/forum/useThread.js +19 -12
  77. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  78. package/dist/tsconfig.build.tsbuildinfo +1 -1
  79. package/dist/utils/APIConstants.d.ts +1 -0
  80. package/dist/utils/APIConstants.d.ts.map +1 -1
  81. package/dist/utils/APIConstants.js +2 -2
  82. package/dist/utils/APIConstants.js.map +1 -1
  83. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  84. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  85. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  86. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  87. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  88. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  89. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,OAAO,EAEL,SAAS,EACT,MAAM,EACP,MAAM,wCAAwC,CAAA;AAoB/C,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,KAAK,CAAC,OAAO,CAAC,CAAA;AAElB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG;IAC9C,OAAO,EAAE,kBAAkB,CAAA;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC/C,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAQzD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAsB,GACvB,EAAE,qBAAqB,2CAsIvB;AAMD,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,qBAAqB,EAChC,SAAS,EAAE,qBAAqB,WAUjC;AAED,eAAO,MAAM,wBAAwB,6DAGpC,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,SAAS,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,OAAO,EACP,UAAU,GACX,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3C"}
1
+ {"version":3,"file":"AutocompleteColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,OAAO,EAEL,SAAS,EACT,MAAM,EACP,MAAM,wCAAwC,CAAA;AAoB/C,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,KAAK,CAAC,OAAO,CAAC,CAAA;AAElB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG;IAC9C,OAAO,EAAE,kBAAkB,CAAA;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC/C,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAQzD;AAqBD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAsB,GACvB,EAAE,qBAAqB,2CA8IvB;AAMD,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,qBAAqB,EAChC,SAAS,EAAE,qBAAqB,WAUjC;AAED,eAAO,MAAM,wBAAwB,6DAGpC,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,SAAS,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,OAAO,EACP,UAAU,GACX,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3C"}
@@ -1,12 +1,12 @@
1
1
  import e from "../utils/parseFreeTextUsingJsonSchemaType.js";
2
2
  import { useGridAutocompleteState as t } from "./useGridAutocompleteState.js";
3
- import { memo as n, useEffect as r, useLayoutEffect as i, useRef as ee, useState as te } from "react";
4
- import { isNil as ne } from "lodash-es";
5
- import { Autocomplete as re, TextField as ie } from "@mui/material";
6
- import { jsx as a } from "react/jsx-runtime";
7
- import { c as ae } from "react/compiler-runtime";
3
+ import { memo as n, useEffect as r, useLayoutEffect as ee, useRef as te, useState as ne } from "react";
4
+ import { isNil as re } from "lodash-es";
5
+ import { Autocomplete as ie, TextField as ae } from "@mui/material";
6
+ import { jsx as i } from "react/jsx-runtime";
7
+ import { c as oe } from "react/compiler-runtime";
8
8
  //#region src/components/DataGrid/columns/AutocompleteColumn.tsx
9
- var oe = {
9
+ var se = {
10
10
  width: "100%",
11
11
  height: "100%",
12
12
  "& .MuiTextField-root .MuiInputBase-root": {
@@ -21,90 +21,101 @@ var oe = {
21
21
  },
22
22
  "& .MuiFormControl-root": { height: "100%" }
23
23
  };
24
- function o(e) {
25
- return ne(e) ? "" : typeof e == "object" ? JSON.stringify(e) : String(e);
24
+ function a(e) {
25
+ return re(e) ? "" : typeof e == "object" ? JSON.stringify(e) : String(e);
26
+ }
27
+ function o(e, t) {
28
+ return e == null || typeof e == "string" && e.trim() === "" ? t : e;
26
29
  }
27
30
  function s(n) {
28
- let s = ae(55), { rowData: c, setRowData: l, choices: u, colType: d, focus: f, stopEditing: p, active: m, clearValue: h } = n, g = h === void 0 ? void 0 : h, _ = ee(l), v;
31
+ let s = oe(56), { rowData: c, setRowData: l, choices: u, colType: d, focus: f, stopEditing: p, active: m, clearValue: h } = n, g = h === void 0 ? void 0 : h, _ = te(l), v;
29
32
  s[0] === l ? v = s[1] : (v = () => {
30
33
  _.current = l;
31
- }, s[0] = l, s[1] = v), i(v);
32
- let y = ee(p), b;
34
+ }, s[0] = l, s[1] = v), ee(v);
35
+ let y = te(p), b;
33
36
  s[2] === p ? b = s[3] : (b = () => {
34
37
  y.current = p;
35
- }, s[2] = p, s[3] = b), i(b);
38
+ }, s[2] = p, s[3] = b), ee(b);
36
39
  let x;
37
- s[4] === c ? x = s[5] : (x = o(c), s[4] = c, s[5] = x);
38
- let S = x, [C, ce] = te(S), w;
39
- s[6] !== d || s[7] !== C || s[8] !== S ? (w = () => {
40
- C !== S && _.current(e(C, d));
41
- }, s[6] = d, s[7] = C, s[8] = S, s[9] = w) : w = s[9];
40
+ s[4] === c ? x = s[5] : (x = a(c), s[4] = c, s[5] = x);
41
+ let S = x, [C, le] = ne(S), w;
42
+ s[6] !== g || s[7] !== d || s[8] !== C || s[9] !== S ? (w = () => {
43
+ if (C !== S) {
44
+ let t = e(C, d);
45
+ _.current(o(t, g));
46
+ }
47
+ }, s[6] = g, s[7] = d, s[8] = C, s[9] = S, s[10] = w) : w = s[10];
42
48
  let T;
43
- s[10] !== m || s[11] !== p || s[12] !== w ? (T = {
49
+ s[11] !== m || s[12] !== p || s[13] !== w ? (T = {
44
50
  active: m,
45
51
  stopEditing: p,
46
52
  onDeactivate: w
47
- }, s[10] = m, s[11] = p, s[12] = w, s[13] = T) : T = s[13];
53
+ }, s[11] = m, s[12] = p, s[13] = w, s[14] = T) : T = s[14];
48
54
  let { menuIsOpen: E, inputRef: D, handleListboxMouseDown: O, notifyOptionCommitted: k, handleMenuOpen: A, handleClose: j } = t(T), M, N;
49
- s[14] !== m || s[15] !== f || s[16] !== S ? (M = () => {
50
- !f && !m && ce(S);
55
+ s[15] !== m || s[16] !== f || s[17] !== S ? (M = () => {
56
+ !f && !m && le(S);
51
57
  }, N = [
52
58
  f,
53
59
  m,
54
60
  S
55
- ], s[14] = m, s[15] = f, s[16] = S, s[17] = M, s[18] = N) : (M = s[17], N = s[18]), r(M, N);
61
+ ], s[15] = m, s[16] = f, s[17] = S, s[18] = M, s[19] = N) : (M = s[18], N = s[19]), r(M, N);
56
62
  let P;
57
- s[19] === c ? P = s[20] : (P = !ne(c) && c !== "", s[19] = c, s[20] = P);
58
- let le = P, F = f ? void 0 : "none", I;
59
- s[21] === F ? I = s[22] : (I = {
63
+ s[20] === c ? P = s[21] : (P = !re(c) && c !== "", s[20] = c, s[21] = P);
64
+ let ue = P, F = f ? void 0 : "none", I;
65
+ s[22] === F ? I = s[23] : (I = {
60
66
  padding: "0 10px",
61
67
  backgroundColor: "inherit",
62
68
  pointerEvents: F
63
- }, s[21] = F, s[22] = I);
69
+ }, s[22] = F, s[23] = I);
64
70
  let L = m ? "visible" : "hidden", R;
65
- s[23] === L ? R = s[24] : (R = {
71
+ s[24] === L ? R = s[25] : (R = {
66
72
  visibility: L,
67
73
  pointerEvents: "auto"
68
- }, s[23] = L, s[24] = R);
74
+ }, s[24] = L, s[25] = R);
69
75
  let z = m ? "visible" : "hidden", B;
70
- s[25] === z ? B = s[26] : (B = {
76
+ s[26] === z ? B = s[27] : (B = {
71
77
  visibility: z,
72
78
  pointerEvents: "auto"
73
- }, s[25] = z, s[26] = B);
79
+ }, s[26] = z, s[27] = B);
74
80
  let V, H;
75
- s[27] === Symbol.for("react.memo_cache_sentinel") ? (V = { visibility: "visible" }, H = { visibility: "visible" }, s[27] = V, s[28] = H) : (V = s[27], H = s[28]);
81
+ s[28] === Symbol.for("react.memo_cache_sentinel") ? (V = { visibility: "visible" }, H = { visibility: "visible" }, s[28] = V, s[29] = H) : (V = s[28], H = s[29]);
76
82
  let U;
77
- s[29] !== I || s[30] !== R || s[31] !== B ? (U = {
78
- ...oe,
83
+ s[30] !== I || s[31] !== R || s[32] !== B ? (U = {
84
+ ...se,
79
85
  "& .MuiAutocomplete-inputRoot": I,
80
86
  "& .MuiAutocomplete-clearIndicator": R,
81
87
  "& .MuiAutocomplete-popupIndicator": B,
82
88
  "&:hover .MuiAutocomplete-clearIndicator": V,
83
89
  "&:hover .MuiAutocomplete-popupIndicator": H
84
- }, s[29] = I, s[30] = R, s[31] = B, s[32] = U) : U = s[32];
90
+ }, s[30] = I, s[31] = R, s[32] = B, s[33] = U) : U = s[33];
85
91
  let W = U, G;
86
- s[33] === Symbol.for("react.memo_cache_sentinel") ? (G = (e) => {
92
+ s[34] === Symbol.for("react.memo_cache_sentinel") ? (G = (e) => {
87
93
  e.key === "Tab" ? (e.preventDefault(), y.current({ nextRow: !1 })) : e.key === "Enter" && (e.preventDefault(), y.current({ nextRow: !0 }));
88
- }, s[33] = G) : G = s[33];
89
- let ue = G, K;
90
- s[34] !== g || s[35] !== d || s[36] !== k ? (K = (t, n, r) => {
91
- k(), r === "clear" ? _.current(g) : r === "createOption" ? _.current(e(n, d)) : _.current(n), setTimeout(() => {
94
+ }, s[34] = G) : G = s[34];
95
+ let de = G, K;
96
+ s[35] !== g || s[36] !== d || s[37] !== k ? (K = (t, n, r) => {
97
+ if (k(), r === "clear") _.current(g);
98
+ else if (r === "createOption") {
99
+ let t = e(n, d);
100
+ _.current(o(t, g));
101
+ } else _.current(n);
102
+ setTimeout(() => {
92
103
  y.current({ nextRow: !1 });
93
104
  }, 0);
94
- }, s[34] = g, s[35] = d, s[36] = k, s[37] = K) : K = s[37];
95
- let q = K, J = !le, Y = c, X;
96
- s[38] === Symbol.for("react.memo_cache_sentinel") ? (X = (e, t) => {
97
- ce(t);
98
- }, s[38] = X) : X = s[38];
105
+ }, s[35] = g, s[36] = d, s[37] = k, s[38] = K) : K = s[38];
106
+ let q = K, J = !ue, Y = c, X;
107
+ s[39] === Symbol.for("react.memo_cache_sentinel") ? (X = (e, t) => {
108
+ le(t);
109
+ }, s[39] = X) : X = s[39];
99
110
  let Z;
100
- s[39] === O ? Z = s[40] : (Z = { listbox: { onMouseDown: O } }, s[39] = O, s[40] = Z);
111
+ s[40] === O ? Z = s[41] : (Z = { listbox: { onMouseDown: O } }, s[40] = O, s[41] = Z);
101
112
  let Q;
102
- s[41] === D ? Q = s[42] : (Q = (e) => /* @__PURE__ */ a(ie, {
113
+ s[42] === D ? Q = s[43] : (Q = (e) => /* @__PURE__ */ i(ae, {
103
114
  ...e,
104
115
  inputRef: D
105
- }), s[41] = D, s[42] = Q);
116
+ }), s[42] = D, s[43] = Q);
106
117
  let $;
107
- return s[43] !== W || s[44] !== u || s[45] !== q || s[46] !== j || s[47] !== A || s[48] !== C || s[49] !== E || s[50] !== J || s[51] !== Y || s[52] !== Z || s[53] !== Q ? ($ = /* @__PURE__ */ a(re, {
118
+ return s[44] !== W || s[45] !== u || s[46] !== q || s[47] !== j || s[48] !== A || s[49] !== C || s[50] !== E || s[51] !== J || s[52] !== Y || s[53] !== Z || s[54] !== Q ? ($ = /* @__PURE__ */ i(ie, {
108
119
  open: E,
109
120
  onOpen: A,
110
121
  forcePopupIcon: !0,
@@ -113,21 +124,21 @@ function s(n) {
113
124
  disablePortal: !1,
114
125
  options: u,
115
126
  selectOnFocus: !0,
116
- getOptionLabel: se,
127
+ getOptionLabel: ce,
117
128
  value: Y,
118
129
  inputValue: C,
119
130
  onInputChange: X,
120
- onKeyDown: ue,
131
+ onKeyDown: de,
121
132
  onClose: j,
122
133
  onChange: q,
123
134
  blurOnSelect: !0,
124
135
  slotProps: Z,
125
136
  renderInput: Q,
126
137
  sx: W
127
- }), s[43] = W, s[44] = u, s[45] = q, s[46] = j, s[47] = A, s[48] = C, s[49] = E, s[50] = J, s[51] = Y, s[52] = Z, s[53] = Q, s[54] = $) : $ = s[54], $;
138
+ }), s[44] = W, s[45] = u, s[46] = q, s[47] = j, s[48] = A, s[49] = C, s[50] = E, s[51] = J, s[52] = Y, s[53] = Z, s[54] = Q, s[55] = $) : $ = s[55], $;
128
139
  }
129
- function se(e) {
130
- return o(e);
140
+ function ce(e) {
141
+ return a(e);
131
142
  }
132
143
  function c(e, t) {
133
144
  return e.rowData === t.rowData && e.choices === t.choices && e.colType === t.colType && e.focus === t.focus && e.active === t.active && e.clearValue === t.clearValue;
@@ -135,7 +146,7 @@ function c(e, t) {
135
146
  var l = n(s, c);
136
147
  function u({ choices: e, colType: t, clearValue: n }) {
137
148
  return {
138
- component: ((r) => /* @__PURE__ */ a(l, {
149
+ component: ((r) => /* @__PURE__ */ i(l, {
139
150
  ...r,
140
151
  choices: e,
141
152
  colType: t,
@@ -148,6 +159,6 @@ function u({ choices: e, colType: t, clearValue: n }) {
148
159
  };
149
160
  }
150
161
  //#endregion
151
- export { s as AutocompleteCell, l as MemoizedAutocompleteCell, c as areAutocompleteCellPropsEqual, u as autocompleteColumn, o as castCellValueToString };
162
+ export { s as AutocompleteCell, l as MemoizedAutocompleteCell, c as areAutocompleteCellPropsEqual, u as autocompleteColumn, a as castCellValueToString };
152
163
 
153
164
  //# sourceMappingURL=AutocompleteColumn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","JSONSchema7Type","isNil","memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CellComponent","CellProps","Column","useGridAutocompleteState","AUTOCOMPLETE_BASE_SX","width","height","padding","backgroundColor","borderRadius","AutocompleteOption","Record","Array","AutocompleteCellProps","rowData","setRowData","value","choices","colType","clearValue","castCellValueToString","toCast","JSON","stringify","String","AutocompleteCell","t0","$","_c","focus","stopEditing","active","t1","undefined","setRowDataRef","t2","current","stopEditingRef","t3","t4","rowDataAsString","localInputState","setLocalInputState","t5","t6","onDeactivate","menuIsOpen","inputRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","t7","t8","t9","hasValue","t10","t11","pointerEvents","t12","t13","visibility","t14","t15","t16","t17","Symbol","for","t18","autocompleteSx","t19","e","key","preventDefault","nextRow","handleKeyDown","t20","_e","newVal","reason","setTimeout","handleChange","t21","t22","t23","_","newInputValue","t24","listbox","onMouseDown","t25","params","t26","_temp","option","areAutocompleteCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteCell","AutocompleteColumnProps","autocompleteColumn","Partial","component","props","Omit","copyValue","pasteValue","disableKeys","keepFocus"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport { isNil } from 'lodash-es'\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n CellComponent,\n CellProps,\n Column,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiTextField-root .MuiInputBase-root': {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n },\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n },\n '& .MuiFormControl-root': { height: '100%' },\n}\n\nexport type AutocompleteOption =\n | string\n | number\n | boolean\n | null\n | Record<string, unknown>\n | Array<unknown>\n\nexport type AutocompleteCellProps = CellProps & {\n rowData: AutocompleteOption\n setRowData: (value: AutocompleteOption) => void\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue?: undefined | null\n}\n\nexport function castCellValueToString(toCast: any): string {\n if (isNil(toCast)) {\n return ''\n }\n if (typeof toCast === 'object') {\n return JSON.stringify(toCast)\n }\n return String(toCast)\n}\n\nexport function AutocompleteCell({\n rowData,\n setRowData,\n choices,\n colType,\n focus,\n stopEditing,\n active,\n clearValue = undefined,\n}: AutocompleteCellProps) {\n // Stable refs so memo(AutocompleteCell) can use default shallow comparison —\n // react-datasheet-grid recreates these functions on every render, but their\n // behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const stopEditingRef = useRef(stopEditing)\n useLayoutEffect(() => {\n stopEditingRef.current = stopEditing\n })\n\n const rowDataAsString = castCellValueToString(rowData)\n const [localInputState, setLocalInputState] =\n useState<string>(rowDataAsString)\n\n const {\n menuIsOpen,\n inputRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({\n active,\n stopEditing,\n onDeactivate: () => {\n if (localInputState !== rowDataAsString) {\n // Commit any free-typed text that hasn't been saved yet\n setRowDataRef.current(\n parseFreeTextGivenJsonSchemaType(localInputState, colType),\n )\n }\n },\n })\n\n // When not actively being edited, sync localInputState with rowData (e.g. after cut)\n useEffect(() => {\n if (!focus && !active) {\n setLocalInputState(rowDataAsString)\n }\n }, [focus, active, rowDataAsString])\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n pointerEvents: focus ? undefined : 'none',\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n }),\n [active, focus],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: false })\n } else if (e.key === 'Enter') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: true })\n }\n }, [])\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: unknown,\n reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n if (reason === 'clear') {\n setRowDataRef.current(clearValue)\n } else if (reason === 'createOption') {\n // The user typed an option that wasn't a defined enum — cast to correct type\n setRowDataRef.current(\n parseFreeTextGivenJsonSchemaType(newVal as string, colType),\n )\n } else {\n setRowDataRef.current(newVal as AutocompleteOption)\n }\n setTimeout(() => {\n stopEditingRef.current({ nextRow: false })\n }, 0)\n },\n [clearValue, colType, notifyOptionCommitted],\n )\n\n return (\n <Autocomplete\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n forcePopupIcon={true}\n disableClearable={!hasValue}\n freeSolo={true}\n disablePortal={false}\n options={choices}\n selectOnFocus\n getOptionLabel={option => castCellValueToString(option)}\n value={rowData as AutocompleteOption}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onKeyDown={handleKeyDown}\n onClose={handleClose}\n onChange={handleChange}\n blurOnSelect={true}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n renderInput={params => <TextField {...params} inputRef={inputRef} />}\n sx={autocompleteSx}\n />\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteCellPropsEqual(\n prevProps: AutocompleteCellProps,\n nextProps: AutocompleteCellProps,\n) {\n return (\n prevProps.rowData === nextProps.rowData &&\n prevProps.choices === nextProps.choices &&\n prevProps.colType === nextProps.colType &&\n prevProps.focus === nextProps.focus &&\n prevProps.active === nextProps.active &&\n prevProps.clearValue === nextProps.clearValue\n )\n}\n\nexport const MemoizedAutocompleteCell = memo(\n AutocompleteCell,\n areAutocompleteCellPropsEqual,\n)\nexport type AutocompleteColumnProps = {\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue: undefined | null\n}\n\nexport function autocompleteColumn({\n choices,\n colType,\n clearValue,\n}: AutocompleteColumnProps): Partial<Column> {\n return {\n component: ((props: Omit<AutocompleteCellProps, 'choices'>) => (\n <MemoizedAutocompleteCell\n {...props}\n choices={choices}\n colType={colType}\n clearValue={clearValue}\n />\n )) as CellComponent,\n // If we update our enums to support labels, then we can update copy to copy the label and paste to lookup the mapping from label -> value\n copyValue: ({ rowData }) => rowData,\n pasteValue: ({ value }) => value,\n disableKeys: true,\n keepFocus: true,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AutocompleteColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","JSONSchema7Type","isNil","memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CellComponent","CellProps","Column","useGridAutocompleteState","AUTOCOMPLETE_BASE_SX","width","height","padding","backgroundColor","borderRadius","AutocompleteOption","Record","Array","AutocompleteCellProps","rowData","setRowData","value","choices","colType","clearValue","castCellValueToString","toCast","JSON","stringify","String","commitParsedValue","parsed","undefined","trim","AutocompleteCell","t0","$","_c","focus","stopEditing","active","t1","setRowDataRef","t2","current","stopEditingRef","t3","t4","rowDataAsString","localInputState","setLocalInputState","t5","t6","onDeactivate","menuIsOpen","inputRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","t7","t8","t9","hasValue","t10","t11","pointerEvents","t12","t13","visibility","t14","t15","t16","t17","Symbol","for","t18","autocompleteSx","t19","e","key","preventDefault","nextRow","handleKeyDown","t20","_e","newVal","reason","parsed_0","setTimeout","handleChange","t21","t22","t23","_","newInputValue","t24","listbox","onMouseDown","t25","params","t26","_temp","option","areAutocompleteCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteCell","AutocompleteColumnProps","autocompleteColumn","Partial","component","props","Omit","copyValue","pasteValue","disableKeys","keepFocus"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport { isNil } from 'lodash-es'\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n CellComponent,\n CellProps,\n Column,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiTextField-root .MuiInputBase-root': {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n },\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n },\n '& .MuiFormControl-root': { height: '100%' },\n}\n\nexport type AutocompleteOption =\n | string\n | number\n | boolean\n | null\n | Record<string, unknown>\n | Array<unknown>\n\nexport type AutocompleteCellProps = CellProps & {\n rowData: AutocompleteOption\n setRowData: (value: AutocompleteOption) => void\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue?: undefined | null\n}\n\nexport function castCellValueToString(toCast: any): string {\n if (isNil(toCast)) {\n return ''\n }\n if (typeof toCast === 'object') {\n return JSON.stringify(toCast)\n }\n return String(toCast)\n}\n\n// Free-text typed/pasted into the cell parses to \"\" for empty input. Committing\n// \"\" leaves the cell as an empty string, which fails enum validation with a\n// terse \"is not a valid enum value\" message. Substitute the column's clearValue\n// (null for required, undefined for optional) so the commit path matches the\n// X-button clear path and the validator surfaces the substantive message.\nfunction commitParsedValue(\n parsed: unknown,\n clearValue: undefined | null,\n): unknown {\n if (\n parsed === null ||\n parsed === undefined ||\n (typeof parsed === 'string' && parsed.trim() === '')\n ) {\n return clearValue\n }\n return parsed\n}\n\nexport function AutocompleteCell({\n rowData,\n setRowData,\n choices,\n colType,\n focus,\n stopEditing,\n active,\n clearValue = undefined,\n}: AutocompleteCellProps) {\n // Stable refs so memo(AutocompleteCell) can use default shallow comparison —\n // react-datasheet-grid recreates these functions on every render, but their\n // behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const stopEditingRef = useRef(stopEditing)\n useLayoutEffect(() => {\n stopEditingRef.current = stopEditing\n })\n\n const rowDataAsString = castCellValueToString(rowData)\n const [localInputState, setLocalInputState] =\n useState<string>(rowDataAsString)\n\n const {\n menuIsOpen,\n inputRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({\n active,\n stopEditing,\n onDeactivate: () => {\n if (localInputState !== rowDataAsString) {\n // Commit any free-typed text that hasn't been saved yet\n const parsed = parseFreeTextGivenJsonSchemaType(\n localInputState,\n colType,\n )\n setRowDataRef.current(\n commitParsedValue(parsed, clearValue) as AutocompleteOption,\n )\n }\n },\n })\n\n // When not actively being edited, sync localInputState with rowData (e.g. after cut)\n useEffect(() => {\n if (!focus && !active) {\n setLocalInputState(rowDataAsString)\n }\n }, [focus, active, rowDataAsString])\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n pointerEvents: focus ? undefined : 'none',\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n }),\n [active, focus],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: false })\n } else if (e.key === 'Enter') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: true })\n }\n }, [])\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: unknown,\n reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n if (reason === 'clear') {\n setRowDataRef.current(clearValue)\n } else if (reason === 'createOption') {\n // The user typed an option that wasn't a defined enum — cast to correct type\n const parsed = parseFreeTextGivenJsonSchemaType(\n newVal as string,\n colType,\n )\n setRowDataRef.current(\n commitParsedValue(parsed, clearValue) as AutocompleteOption,\n )\n } else {\n setRowDataRef.current(newVal as AutocompleteOption)\n }\n setTimeout(() => {\n stopEditingRef.current({ nextRow: false })\n }, 0)\n },\n [clearValue, colType, notifyOptionCommitted],\n )\n\n return (\n <Autocomplete\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n forcePopupIcon={true}\n disableClearable={!hasValue}\n freeSolo={true}\n disablePortal={false}\n options={choices}\n selectOnFocus\n getOptionLabel={option => castCellValueToString(option)}\n value={rowData as AutocompleteOption}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onKeyDown={handleKeyDown}\n onClose={handleClose}\n onChange={handleChange}\n blurOnSelect={true}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n renderInput={params => <TextField {...params} inputRef={inputRef} />}\n sx={autocompleteSx}\n />\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteCellPropsEqual(\n prevProps: AutocompleteCellProps,\n nextProps: AutocompleteCellProps,\n) {\n return (\n prevProps.rowData === nextProps.rowData &&\n prevProps.choices === nextProps.choices &&\n prevProps.colType === nextProps.colType &&\n prevProps.focus === nextProps.focus &&\n prevProps.active === nextProps.active &&\n prevProps.clearValue === nextProps.clearValue\n )\n}\n\nexport const MemoizedAutocompleteCell = memo(\n AutocompleteCell,\n areAutocompleteCellPropsEqual,\n)\nexport type AutocompleteColumnProps = {\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue: undefined | null\n}\n\nexport function autocompleteColumn({\n choices,\n colType,\n clearValue,\n}: AutocompleteColumnProps): Partial<Column> {\n return {\n component: ((props: Omit<AutocompleteCellProps, 'choices'>) => (\n <MemoizedAutocompleteCell\n {...props}\n choices={choices}\n colType={colType}\n clearValue={clearValue}\n />\n )) as CellComponent,\n // If we update our enums to support labels, then we can update copy to copy the label and paste to lookup the mapping from label -> value\n copyValue: ({ rowData }) => rowData,\n pasteValue: ({ value }) => value,\n disableKeys: true,\n keepFocus: true,\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteMultipleEnumColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAS7C,OAAO,EAAiB,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAEL,qBAAqB,EAErB,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AA+B7B,MAAM,MAAM,8BAA8B,GAAG,kBAAkB,CAAA;AAE/D,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,qBAAqB,EACrB,SAAS,CACV,GAAG;IACF,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AA4OD,wBAAgB,yCAAyC,CACvD,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iCAAiC,WAM7C;AAOD,MAAM,MAAM,mCAAmC,GAAG;IAChD,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,OAAO,EACP,OAAO,EACP,SAAa,EACb,aAAqB,EACrB,UAAsB,GACvB,EAAE,mCAAmC,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CvD"}
1
+ {"version":3,"file":"AutocompleteMultipleEnumColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAS7C,OAAO,EAAiB,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAEL,qBAAqB,EAErB,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AA+B7B,MAAM,MAAM,8BAA8B,GAAG,kBAAkB,CAAA;AAE/D,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,qBAAqB,EACrB,SAAS,CACV,GAAG;IACF,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AA4OD,wBAAgB,yCAAyC,CACvD,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iCAAiC,WAM7C;AAOD,MAAM,MAAM,mCAAmC,GAAG;IAChD,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,OAAO,EACP,OAAO,EACP,SAAa,EACb,aAAqB,EACrB,UAAsB,GACvB,EAAE,mCAAmC,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDvD"}
@@ -197,7 +197,7 @@ function f({ choices: t, colType: n, limitTags: i = 2, dynamicHeight: a = !1, cl
197
197
  pasteValue: ({ value: t }) => {
198
198
  if (typeof t != "string") return t;
199
199
  let r = t.split(/[,\t]/).map((e) => e.trim()).filter((e) => e.length > 0).map((t) => e(t, n)).filter((e) => e != null);
200
- return r.length > 0 ? r : [];
200
+ return r.length > 0 ? r : ee;
201
201
  },
202
202
  disableKeys: !0,
203
203
  keepFocus: !0,
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteMultipleEnumColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","Tooltip","JSONSchema7Type","memo","useCallback","useLayoutEffect","useMemo","useRef","useState","CellComponent","Column","areAutocompleteCellPropsEqual","AutocompleteCellProps","castCellValueToString","AutocompleteOption","GridAutocompleteChip","isNil","isEqual","useGridAutocompleteState","AUTOCOMPLETE_MULTIPLE_BASE_SX","width","height","margin","visibility","TEXT_FIELD_SX","padding","backgroundColor","borderRadius","AutocompleteMultipleEnumOption","AutocompleteMultipleEnumCellProps","Omit","choices","limitTags","clearValue","EnumOption","label","value","createOptionFromValue","createSafeRowData","rowData","Array","isArray","AutocompleteMultipleEnumCell","t0","$","_c","setRowData","colType","t1","active","focus","stopEditing","t2","undefined","setRowDataRef","t3","current","localInputState","setLocalInputState","t4","menuIsOpen","setMenuIsOpen","inputRef","activeRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","effectiveLimitTags","optionsWithLabels","safeRowData","selectedOptions","t5","t6","map","length","_temp","join","tooltipContent","hasValue","t7","t8","t9","t10","t11","t12","t13","Symbol","for","background","t14","pointerEvents","flexWrap","minHeight","maxHeight","overflowY","overflowX","t15","t16","t17","t18","t19","autocompleteSx","t20","_e","newVal","_reason","values","item_0","item","handleChange","t21","trim","parsedValue","handleBlur","t22","t23","overflow","t24","t25","t26","_","newInputValue","t27","t28","listbox","onMouseDown","t29","tagValue","getTagProps","option_1","index","key","tagProps","optionValue_0","option","optionValue","t30","params","input","InputProps","disableUnderline","sx","t31","_temp2","_temp3","t32","option_0","valueValue","areAutocompleteMultipleEnumCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteMultipleEnumCell","AutocompleteMultipleEnumColumnProps","dynamicHeight","autocompleteMultipleEnumColumn","Partial","component","props","copyValue","pasteValue","delimiters","parsedValues","split","filter","disableKeys","keepFocus","cellClassName"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n Tooltip,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport {\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { CellComponent, Column } from '@sage-bionetworks/react-datasheet-grid'\nimport {\n areAutocompleteCellPropsEqual,\n AutocompleteCellProps,\n castCellValueToString,\n AutocompleteOption,\n} from './AutocompleteColumn'\nimport { GridAutocompleteChip } from './GridAutocompleteChip'\nimport isNil from 'lodash-es/isNil'\nimport isEqual from 'lodash-es/isEqual'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_MULTIPLE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiFormControl-root': {\n height: '100%',\n },\n '& .MuiAutocomplete-tag': {\n margin: '1px',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n}\n\nconst TEXT_FIELD_SX: SxProps<Theme> = {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n}\n\nexport type AutocompleteMultipleEnumOption = AutocompleteOption\n\nexport type AutocompleteMultipleEnumCellProps = Omit<\n AutocompleteCellProps,\n 'choices'\n> & {\n choices: AutocompleteMultipleEnumOption[]\n limitTags?: number\n clearValue?: undefined | null\n}\n\ntype EnumOption = {\n label: string\n value: AutocompleteMultipleEnumOption\n}\n\nfunction createOptionFromValue(\n value: AutocompleteMultipleEnumOption,\n): EnumOption {\n return {\n label: castCellValueToString(value),\n value: value,\n }\n}\n\nfunction createSafeRowData(\n rowData: AutocompleteMultipleEnumOption,\n): AutocompleteMultipleEnumOption[] {\n if (Array.isArray(rowData)) {\n return rowData as AutocompleteMultipleEnumOption[]\n } else if (isNil(rowData)) {\n return []\n } else {\n return [rowData]\n }\n}\n\nfunction AutocompleteMultipleEnumCell({\n rowData,\n setRowData,\n choices,\n colType,\n limitTags = 2,\n active,\n focus,\n stopEditing,\n clearValue = undefined,\n}: AutocompleteMultipleEnumCellProps) {\n // Stable refs so memo(AutocompleteMultipleEnumCell) can use default shallow\n // comparison — react-datasheet-grid recreates these functions on every render,\n // but their behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const [localInputState, setLocalInputState] = useState<string>('')\n\n const {\n menuIsOpen,\n setMenuIsOpen,\n inputRef,\n activeRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({ active, stopEditing })\n\n const safeRowData = createSafeRowData(rowData)\n const optionsWithLabels = choices.map(createOptionFromValue)\n const selectedOptions = safeRowData.map(createOptionFromValue)\n const effectiveLimitTags = active ? -1 : limitTags\n\n // Create tooltip content showing all values\n const tooltipContent =\n safeRowData.length > 0\n ? safeRowData.map(item => castCellValueToString(item)).join(',')\n : ''\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_MULTIPLE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n pointerEvents: focus ? undefined : 'none',\n padding: '0 10px',\n backgroundColor: 'inherit',\n // Allow tags to wrap and enable scrolling\n flexWrap: active ? 'wrap' : 'nowrap',\n minHeight: '100%',\n maxHeight: '100%',\n overflowY: active ? 'auto' : 'hidden',\n overflowX: 'hidden',\n '&::-webkit-scrollbar': {\n width: '6px',\n height: '6px',\n },\n '&::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '&::-webkit-scrollbar-thumb': {\n background: '#888',\n borderRadius: '3px',\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: '#555',\n },\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n }),\n [active, focus],\n )\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: (EnumOption | string)[],\n _reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n const values = newVal.map(item => {\n return typeof item === 'string'\n ? parseFreeTextGivenJsonSchemaType(item, colType)\n : item.value\n })\n // Use clearValue when all items are removed\n setRowDataRef.current(values.length === 0 ? clearValue : values)\n setLocalInputState('')\n if (!activeRef.current) {\n // The cell was deactivated while the option click was in progress (portal\n // click was seen as an outside click by the grid). Now that the value is\n // committed, close the menu.\n setMenuIsOpen(false)\n }\n },\n [activeRef, clearValue, colType, notifyOptionCommitted, setMenuIsOpen],\n )\n\n const handleBlur = useCallback(() => {\n if (localInputState.trim()) {\n const parsedValue = parseFreeTextGivenJsonSchemaType(\n localInputState,\n colType,\n )\n setRowDataRef.current([...safeRowData, parsedValue])\n setLocalInputState('')\n }\n }, [localInputState, colType, safeRowData])\n\n return (\n <Tooltip\n title={tooltipContent}\n placement=\"top-start\"\n arrow\n enterDelay={500}\n disableHoverListener={active || safeRowData.length <= limitTags}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <Autocomplete\n forcePopupIcon={choices.length > 0}\n disableClearable={!hasValue}\n multiple\n freeSolo\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n disablePortal={false}\n limitTags={effectiveLimitTags}\n options={optionsWithLabels}\n getOptionLabel={option => {\n // Handle both string (for freeSolo) and object options\n return typeof option === 'string' ? option : option.label\n }}\n isOptionEqualToValue={(option, value) => {\n // Compare the actual values, not labels\n const optionValue =\n typeof option === 'string' ? option : option.value\n const valueValue = typeof value === 'string' ? value : value.value\n return isEqual(optionValue, valueValue)\n }}\n value={selectedOptions}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onClose={handleClose}\n onChange={handleChange}\n disableCloseOnSelect={choices.length > 1}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n onBlur={handleBlur}\n renderValue={(tagValue, getTagProps) =>\n tagValue.map((option, index) => {\n const { key, ...tagProps } = getTagProps({ index })\n const optionValue =\n typeof option === 'string' ? option : option.value\n return (\n <GridAutocompleteChip\n key={key}\n option={optionValue}\n active={active}\n {...tagProps}\n />\n )\n })\n }\n renderInput={params => (\n <TextField\n {...params}\n inputRef={inputRef}\n slotProps={{\n input: {\n ...params.InputProps,\n disableUnderline: true,\n sx: TEXT_FIELD_SX,\n },\n }}\n />\n )}\n sx={autocompleteSx}\n />\n </div>\n </Tooltip>\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteMultipleEnumCellPropsEqual(\n prevProps: AutocompleteMultipleEnumCellProps,\n nextProps: AutocompleteMultipleEnumCellProps,\n) {\n return (\n areAutocompleteCellPropsEqual(prevProps, nextProps) &&\n prevProps.limitTags === nextProps.limitTags\n )\n}\n\nconst MemoizedAutocompleteMultipleEnumCell = memo(\n AutocompleteMultipleEnumCell,\n areAutocompleteMultipleEnumCellPropsEqual,\n)\n\nexport type AutocompleteMultipleEnumColumnProps = {\n choices: AutocompleteMultipleEnumOption[]\n colType?: JSONSchema7Type\n limitTags?: number\n dynamicHeight?: boolean\n clearValue?: undefined | null\n}\n\nexport function autocompleteMultipleEnumColumn({\n choices,\n colType,\n limitTags = 2,\n dynamicHeight = false,\n clearValue = undefined,\n}: AutocompleteMultipleEnumColumnProps): Partial<Column> {\n return {\n component: ((\n props: Omit<AutocompleteMultipleEnumCellProps, 'choices' | 'limitTags'>,\n ) => (\n <MemoizedAutocompleteMultipleEnumCell\n {...props}\n choices={choices}\n colType={colType}\n limitTags={limitTags}\n clearValue={clearValue}\n />\n )) as CellComponent,\n copyValue: ({ rowData }) => {\n // Convert array to comma-separated string\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.map(item => castCellValueToString(item)).join(',')\n },\n pasteValue: ({ value }) => {\n if (typeof value !== 'string') {\n return value\n }\n\n // Split by comma or tab and clean up values\n const delimiters = /[,\\t]/\n const parsedValues = value\n .split(delimiters)\n .map(item => item.trim())\n .filter(item => item.length > 0)\n .map(item => parseFreeTextGivenJsonSchemaType(item, colType))\n .filter(item => item !== null && item !== undefined)\n\n return parsedValues.length > 0 ? parsedValues : []\n },\n disableKeys: true,\n keepFocus: true,\n ...(dynamicHeight && {\n cellClassName: ({ rowData }) => {\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.length > 3\n ? 'multi-value-cell-large'\n : 'multi-value-cell'\n },\n }),\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AutocompleteMultipleEnumColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","Tooltip","JSONSchema7Type","memo","useCallback","useLayoutEffect","useMemo","useRef","useState","CellComponent","Column","areAutocompleteCellPropsEqual","AutocompleteCellProps","castCellValueToString","AutocompleteOption","GridAutocompleteChip","isNil","isEqual","useGridAutocompleteState","AUTOCOMPLETE_MULTIPLE_BASE_SX","width","height","margin","visibility","TEXT_FIELD_SX","padding","backgroundColor","borderRadius","AutocompleteMultipleEnumOption","AutocompleteMultipleEnumCellProps","Omit","choices","limitTags","clearValue","EnumOption","label","value","createOptionFromValue","createSafeRowData","rowData","Array","isArray","AutocompleteMultipleEnumCell","t0","$","_c","setRowData","colType","t1","active","focus","stopEditing","t2","undefined","setRowDataRef","t3","current","localInputState","setLocalInputState","t4","menuIsOpen","setMenuIsOpen","inputRef","activeRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","effectiveLimitTags","optionsWithLabels","safeRowData","selectedOptions","t5","t6","map","length","_temp","join","tooltipContent","hasValue","t7","t8","t9","t10","t11","t12","t13","Symbol","for","background","t14","pointerEvents","flexWrap","minHeight","maxHeight","overflowY","overflowX","t15","t16","t17","t18","t19","autocompleteSx","t20","_e","newVal","_reason","values","item_0","item","handleChange","t21","trim","parsedValue","handleBlur","t22","t23","overflow","t24","t25","t26","_","newInputValue","t27","t28","listbox","onMouseDown","t29","tagValue","getTagProps","option_1","index","key","tagProps","optionValue_0","option","optionValue","t30","params","input","InputProps","disableUnderline","sx","t31","_temp2","_temp3","t32","option_0","valueValue","areAutocompleteMultipleEnumCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteMultipleEnumCell","AutocompleteMultipleEnumColumnProps","dynamicHeight","autocompleteMultipleEnumColumn","Partial","component","props","copyValue","pasteValue","delimiters","parsedValues","split","filter","disableKeys","keepFocus","cellClassName"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n Tooltip,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport {\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { CellComponent, Column } from '@sage-bionetworks/react-datasheet-grid'\nimport {\n areAutocompleteCellPropsEqual,\n AutocompleteCellProps,\n castCellValueToString,\n AutocompleteOption,\n} from './AutocompleteColumn'\nimport { GridAutocompleteChip } from './GridAutocompleteChip'\nimport isNil from 'lodash-es/isNil'\nimport isEqual from 'lodash-es/isEqual'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_MULTIPLE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiFormControl-root': {\n height: '100%',\n },\n '& .MuiAutocomplete-tag': {\n margin: '1px',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n}\n\nconst TEXT_FIELD_SX: SxProps<Theme> = {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n}\n\nexport type AutocompleteMultipleEnumOption = AutocompleteOption\n\nexport type AutocompleteMultipleEnumCellProps = Omit<\n AutocompleteCellProps,\n 'choices'\n> & {\n choices: AutocompleteMultipleEnumOption[]\n limitTags?: number\n clearValue?: undefined | null\n}\n\ntype EnumOption = {\n label: string\n value: AutocompleteMultipleEnumOption\n}\n\nfunction createOptionFromValue(\n value: AutocompleteMultipleEnumOption,\n): EnumOption {\n return {\n label: castCellValueToString(value),\n value: value,\n }\n}\n\nfunction createSafeRowData(\n rowData: AutocompleteMultipleEnumOption,\n): AutocompleteMultipleEnumOption[] {\n if (Array.isArray(rowData)) {\n return rowData as AutocompleteMultipleEnumOption[]\n } else if (isNil(rowData)) {\n return []\n } else {\n return [rowData]\n }\n}\n\nfunction AutocompleteMultipleEnumCell({\n rowData,\n setRowData,\n choices,\n colType,\n limitTags = 2,\n active,\n focus,\n stopEditing,\n clearValue = undefined,\n}: AutocompleteMultipleEnumCellProps) {\n // Stable refs so memo(AutocompleteMultipleEnumCell) can use default shallow\n // comparison — react-datasheet-grid recreates these functions on every render,\n // but their behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const [localInputState, setLocalInputState] = useState<string>('')\n\n const {\n menuIsOpen,\n setMenuIsOpen,\n inputRef,\n activeRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({ active, stopEditing })\n\n const safeRowData = createSafeRowData(rowData)\n const optionsWithLabels = choices.map(createOptionFromValue)\n const selectedOptions = safeRowData.map(createOptionFromValue)\n const effectiveLimitTags = active ? -1 : limitTags\n\n // Create tooltip content showing all values\n const tooltipContent =\n safeRowData.length > 0\n ? safeRowData.map(item => castCellValueToString(item)).join(',')\n : ''\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_MULTIPLE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n pointerEvents: focus ? undefined : 'none',\n padding: '0 10px',\n backgroundColor: 'inherit',\n // Allow tags to wrap and enable scrolling\n flexWrap: active ? 'wrap' : 'nowrap',\n minHeight: '100%',\n maxHeight: '100%',\n overflowY: active ? 'auto' : 'hidden',\n overflowX: 'hidden',\n '&::-webkit-scrollbar': {\n width: '6px',\n height: '6px',\n },\n '&::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '&::-webkit-scrollbar-thumb': {\n background: '#888',\n borderRadius: '3px',\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: '#555',\n },\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n }),\n [active, focus],\n )\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: (EnumOption | string)[],\n _reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n const values = newVal.map(item => {\n return typeof item === 'string'\n ? parseFreeTextGivenJsonSchemaType(item, colType)\n : item.value\n })\n // Use clearValue when all items are removed\n setRowDataRef.current(values.length === 0 ? clearValue : values)\n setLocalInputState('')\n if (!activeRef.current) {\n // The cell was deactivated while the option click was in progress (portal\n // click was seen as an outside click by the grid). Now that the value is\n // committed, close the menu.\n setMenuIsOpen(false)\n }\n },\n [activeRef, clearValue, colType, notifyOptionCommitted, setMenuIsOpen],\n )\n\n const handleBlur = useCallback(() => {\n if (localInputState.trim()) {\n const parsedValue = parseFreeTextGivenJsonSchemaType(\n localInputState,\n colType,\n )\n setRowDataRef.current([...safeRowData, parsedValue])\n setLocalInputState('')\n }\n }, [localInputState, colType, safeRowData])\n\n return (\n <Tooltip\n title={tooltipContent}\n placement=\"top-start\"\n arrow\n enterDelay={500}\n disableHoverListener={active || safeRowData.length <= limitTags}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <Autocomplete\n forcePopupIcon={choices.length > 0}\n disableClearable={!hasValue}\n multiple\n freeSolo\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n disablePortal={false}\n limitTags={effectiveLimitTags}\n options={optionsWithLabels}\n getOptionLabel={option => {\n // Handle both string (for freeSolo) and object options\n return typeof option === 'string' ? option : option.label\n }}\n isOptionEqualToValue={(option, value) => {\n // Compare the actual values, not labels\n const optionValue =\n typeof option === 'string' ? option : option.value\n const valueValue = typeof value === 'string' ? value : value.value\n return isEqual(optionValue, valueValue)\n }}\n value={selectedOptions}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onClose={handleClose}\n onChange={handleChange}\n disableCloseOnSelect={choices.length > 1}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n onBlur={handleBlur}\n renderValue={(tagValue, getTagProps) =>\n tagValue.map((option, index) => {\n const { key, ...tagProps } = getTagProps({ index })\n const optionValue =\n typeof option === 'string' ? option : option.value\n return (\n <GridAutocompleteChip\n key={key}\n option={optionValue}\n active={active}\n {...tagProps}\n />\n )\n })\n }\n renderInput={params => (\n <TextField\n {...params}\n inputRef={inputRef}\n slotProps={{\n input: {\n ...params.InputProps,\n disableUnderline: true,\n sx: TEXT_FIELD_SX,\n },\n }}\n />\n )}\n sx={autocompleteSx}\n />\n </div>\n </Tooltip>\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteMultipleEnumCellPropsEqual(\n prevProps: AutocompleteMultipleEnumCellProps,\n nextProps: AutocompleteMultipleEnumCellProps,\n) {\n return (\n areAutocompleteCellPropsEqual(prevProps, nextProps) &&\n prevProps.limitTags === nextProps.limitTags\n )\n}\n\nconst MemoizedAutocompleteMultipleEnumCell = memo(\n AutocompleteMultipleEnumCell,\n areAutocompleteMultipleEnumCellPropsEqual,\n)\n\nexport type AutocompleteMultipleEnumColumnProps = {\n choices: AutocompleteMultipleEnumOption[]\n colType?: JSONSchema7Type\n limitTags?: number\n dynamicHeight?: boolean\n clearValue?: undefined | null\n}\n\nexport function autocompleteMultipleEnumColumn({\n choices,\n colType,\n limitTags = 2,\n dynamicHeight = false,\n clearValue = undefined,\n}: AutocompleteMultipleEnumColumnProps): Partial<Column> {\n return {\n component: ((\n props: Omit<AutocompleteMultipleEnumCellProps, 'choices' | 'limitTags'>,\n ) => (\n <MemoizedAutocompleteMultipleEnumCell\n {...props}\n choices={choices}\n colType={colType}\n limitTags={limitTags}\n clearValue={clearValue}\n />\n )) as CellComponent,\n copyValue: ({ rowData }) => {\n // Convert array to comma-separated string\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.map(item => castCellValueToString(item)).join(',')\n },\n pasteValue: ({ value }) => {\n if (typeof value !== 'string') {\n return value\n }\n\n // Split by comma or tab and clean up values\n const delimiters = /[,\\t]/\n const parsedValues = value\n .split(delimiters)\n .map(item => item.trim())\n .filter(item => item.length > 0)\n .map(item => parseFreeTextGivenJsonSchemaType(item, colType))\n .filter(item => item !== null && item !== undefined)\n\n // When no values remain, use clearValue (null for required, undefined for\n // optional) so paste and the X-clear button converge on the same\n // in-model representation instead of [].\n // Note: columnFactory also wraps this pasteValue with\n // wrapPasteValueWithSchemaCoercion, which is a no-op here because\n // coerceModelCellValue does not coerce empty arrays — this layer is the\n // one responsible for the [] → clearValue conversion.\n return parsedValues.length > 0 ? parsedValues : clearValue\n },\n disableKeys: true,\n keepFocus: true,\n ...(dynamicHeight && {\n cellClassName: ({ rowData }) => {\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.length > 3\n ? 'multi-value-cell-large'\n : 'multi-value-cell'\n },\n }),\n }\n}\n"],"mappings":"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"}
@@ -20,7 +20,7 @@ export type ModelChange = {
20
20
  replicaId: string;
21
21
  selection: ReplicaSelectionModel;
22
22
  };
23
- export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap): string | number | boolean | import("@sage-bionetworks/synapse-types").ValidationResults | Map<string, string[]> | Record<string, import("@/components/DataGrid/DataGridTypes").CellChangeInfo> | null | undefined;
23
+ export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap): unknown;
24
24
  /**
25
25
  * Applies a single change operation (create, delete, or update) to the GridModel.
26
26
  *
@@ -1 +1 @@
1
- {"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAI9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,CAAA;AAEL,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,qNAexC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QAyDxC"}
1
+ {"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAM9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,CAAA;AAEL,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,WAQxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QAiExC"}
@@ -1,46 +1,49 @@
1
- import e from "lodash-es/isEqual";
2
- import { s as t } from "json-joy/lib/json-crdt-patch";
1
+ import { getEmptyValue as e } from "./getEmptyValue.js";
2
+ import { coerceModelCellValue as t } from "./schemaAwarePasteValue.js";
3
+ import n from "lodash-es/isEqual";
4
+ import { s as r } from "json-joy/lib/json-crdt-patch";
3
5
  //#region src/components/DataGrid/utils/applyModelChange.ts
4
- function n(e, t, n) {
5
- let r;
6
- return r = Object.hasOwn(e, t) ? e[t] : n[t]?.isRequired ? null : void 0, r;
6
+ function i(n, r, i) {
7
+ let a = i[r];
8
+ return Object.hasOwn(n, r) ? t(n[r], a) : e(a?.isRequired);
7
9
  }
8
- function r(r, i, a) {
9
- let o = r.api.arr(["rows"]), { columnNames: s } = r.api.getSnapshot();
10
- switch (i.type) {
10
+ function a(e, a, o) {
11
+ let s = e.api.arr(["rows"]), { columnNames: c } = e.api.getSnapshot();
12
+ switch (a.type) {
11
13
  case "CREATE": {
12
- let e = s.map((e) => t.con(n(i.rowData, e, a)));
13
- o?.ins(i.rowIndex, [t.obj({
14
- data: t.vec(...e),
15
- metadata: t.obj({})
14
+ let e = c.map((e) => r.con(i(a.rowData, e, o)));
15
+ s?.ins(a.rowIndex, [r.obj({
16
+ data: r.vec(...e),
17
+ metadata: r.obj({})
16
18
  })]);
17
19
  break;
18
20
  }
19
21
  case "DELETE":
20
- o?.del(i.rowIndex, i.count ?? 1);
22
+ s?.del(a.rowIndex, a.count ?? 1);
21
23
  break;
22
24
  case "UPDATE": {
23
- let n = r.api.getSnapshot().rows[i.rowIndex]?.data;
24
- Object.entries(i.updatedData).forEach(([a, o]) => {
25
- if (a.startsWith("_")) return;
26
- let c = s.indexOf(a);
27
- if (c !== -1) {
28
- if (e(n?.[c], o)) return;
29
- r.api.vec([
25
+ let i = e.api.getSnapshot().rows[a.rowIndex]?.data;
26
+ Object.entries(a.updatedData).forEach(([s, l]) => {
27
+ if (s.startsWith("_")) return;
28
+ let u = c.indexOf(s);
29
+ if (u !== -1) {
30
+ let c = t(l, o[s]);
31
+ if (n(i?.[u], c)) return;
32
+ e.api.vec([
30
33
  "rows",
31
- String(i.rowIndex),
34
+ String(a.rowIndex),
32
35
  "data"
33
- ])?.set([[c, t.con(o)]]);
36
+ ])?.set([[u, r.con(c)]]);
34
37
  }
35
38
  });
36
39
  break;
37
40
  }
38
41
  case "SET_SELECTION":
39
- r.api.obj().has("selection") || r.api.obj().add(["selection"], t.obj({})), r.api.obj(["selection"]).set({ [i.replicaId]: t.con(i.selection) });
42
+ e.api.obj().has("selection") || e.api.obj().add(["selection"], r.obj({})), e.api.obj(["selection"]).set({ [a.replicaId]: r.con(a.selection) });
40
43
  break;
41
44
  }
42
45
  }
43
46
  //#endregion
44
- export { r as applyModelChange, n as getDefaultValueForProperty };
47
+ export { a as applyModelChange, i as getDefaultValueForProperty };
45
48
 
46
49
  //# sourceMappingURL=applyModelChange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"applyModelChange.js","names":["DataGridRow","GridModel","ReplicaSelectionModel","SchemaPropertiesMap","s","isEqual","ModelChange","type","rowIndex","rowData","count","updatedData","replicaId","selection","getDefaultValueForProperty","row","property","schemaPropertyInfo","value","Object","hasOwn","isRequired","undefined","applyModelChange","model","change","rowsArr","api","arr","columnNames","getSnapshot","map","name","con","ins","obj","data","vec","metadata","del","currentRowData","rows","entries","forEach","key","startsWith","colIndex","indexOf","rowVec","String","set","has","add"],"sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"sourcesContent":["import {\n DataGridRow,\n GridModel,\n ReplicaSelectionModel,\n} from '@/components/DataGrid/DataGridTypes'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { s } from 'json-joy/lib/json-crdt-patch'\nimport isEqual from 'lodash-es/isEqual'\n\n/**\n * Represents a change operation on the GridModel.\n */\nexport type ModelChange =\n | { type: 'CREATE'; rowIndex: number; rowData: DataGridRow }\n | { type: 'DELETE'; rowIndex: number; count?: number }\n | { type: 'UPDATE'; rowIndex: number; updatedData: DataGridRow }\n | {\n type: 'SET_SELECTION'\n replicaId: string\n selection: ReplicaSelectionModel\n }\n\nexport function getDefaultValueForProperty(\n row: DataGridRow,\n property: string,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n let value\n if (Object.hasOwn(row, property)) {\n value = row[property]\n } else {\n // Inspect the schema. If the property is required, it should be `null`\n // Otherwise, the property is optional. It should be undefined to be valid against the JSON Schema\n if (schemaPropertyInfo[property]?.isRequired) {\n value = null\n } else {\n value = undefined\n }\n }\n return value\n}\n\n/**\n * Applies a single change operation (create, delete, or update) to the GridModel.\n *\n * @param model - The grid model to modify\n * @param change - The change to apply\n */\nexport function applyModelChange(\n model: GridModel,\n change: ModelChange,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const rowsArr = model.api.arr(['rows'])\n const { columnNames } = model.api.getSnapshot()\n\n switch (change.type) {\n case 'CREATE': {\n // Convert rowData object into a CRDT vector\n const rowData = columnNames.map(name =>\n s.con(\n getDefaultValueForProperty(change.rowData, name, schemaPropertyInfo),\n ),\n )\n // Insert a new row object at the specified index\n rowsArr?.ins(change.rowIndex, [\n s.obj({ data: s.vec(...rowData), metadata: s.obj({}) }),\n ])\n break\n }\n\n case 'DELETE':\n rowsArr?.del(change.rowIndex, change.count ?? 1)\n break\n\n case 'UPDATE': {\n const currentRowData = model.api.getSnapshot().rows[change.rowIndex]?.data\n Object.entries(change.updatedData).forEach(([key, value]) => {\n if (key.startsWith('_')) return // Skip internal properties like _rowId\n const colIndex = columnNames.indexOf(key)\n if (colIndex !== -1) {\n // Only write cells whose value actually changed to avoid stamping\n // the local replica's SID on unmodified cells.\n if (isEqual(currentRowData?.[colIndex], value)) return\n // Get the CRDT array of cell values for this row\n const rowVec = model.api.vec([\n 'rows',\n String(change.rowIndex),\n 'data',\n ])\n // Update the specific column with the new value\n rowVec?.set([[colIndex, s.con(value)]])\n }\n })\n break\n }\n case 'SET_SELECTION': {\n if (!model.api.obj().has('selection')) {\n // Create if not exists\n model.api.obj().add(['selection'], s.obj({}))\n }\n model.api\n .obj(['selection'])\n .set({ [change.replicaId]: s.con(change.selection) })\n\n break\n }\n }\n}\n"],"mappings":";;;AAsBA,SAAgBc,EACdC,GACAC,GACAC,GACA;CACA,IAAIC;AAYJ,QAXA,AAQIA,IARAC,OAAOC,OAAOL,GAAKC,EAAS,GACtBD,EAAIC,KAIRC,EAAmBD,IAAWK,aACxB,OAEAC,KAAAA,GAGLJ;;AAST,SAAgBK,EACdC,GACAC,GACAR,GACA;CACA,IAAMS,IAAUF,EAAMG,IAAIC,IAAI,CAAC,OAAO,CAAC,EACjC,EAAEC,mBAAgBL,EAAMG,IAAIG,aAAa;AAE/C,SAAQL,EAAOlB,MAAf;EACE,KAAK,UAAU;GAEb,IAAME,IAAUoB,EAAYE,KAAIC,MAC9B5B,EAAE6B,IACAnB,EAA2BW,EAAOhB,SAASuB,GAAMf,EACnD,CACF,CAAC;AAEDS,MAASQ,IAAIT,EAAOjB,UAAU,CAC5BJ,EAAE+B,IAAI;IAAEC,MAAMhC,EAAEiC,IAAI,GAAG5B,EAAQ;IAAE6B,UAAUlC,EAAE+B,IAAI,EAAE,CAAA;IAAG,CAAC,CACxD,CAAC;AACF;;EAGF,KAAK;AACHT,MAASa,IAAId,EAAOjB,UAAUiB,EAAOf,SAAS,EAAE;AAChD;EAEF,KAAK,UAAU;GACb,IAAM8B,IAAiBhB,EAAMG,IAAIG,aAAa,CAACW,KAAKhB,EAAOjB,WAAW4B;AACtEjB,UAAOuB,QAAQjB,EAAOd,YAAY,CAACgC,SAAS,CAACC,GAAK1B,OAAW;AAC3D,QAAI0B,EAAIC,WAAW,IAAI,CAAE;IACzB,IAAMC,IAAWjB,EAAYkB,QAAQH,EAAI;AACzC,QAAIE,MAAa,IAAI;AAGnB,SAAIzC,EAAQmC,IAAiBM,IAAW5B,EAAM,CAAE;AAEjCM,OAAMG,IAAIU,IAAI;MAC3B;MACAY,OAAOxB,EAAOjB,SAAS;MACvB;MACD,CAEDwC,EAAQE,IAAI,CAAC,CAACJ,GAAU1C,EAAE6B,IAAIf,EAAM,CAAC,CAAC,CAAC;;KAEzC;AACF;;EAEF,KAAK;AAKHM,GAJKA,EAAMG,IAAIQ,KAAK,CAACgB,IAAI,YAAY,IAEnC3B,EAAMG,IAAIQ,KAAK,CAACiB,IAAI,CAAC,YAAY,EAAEhD,EAAE+B,IAAI,EAAE,CAAC,CAAC,EAE/CX,EAAMG,IACHQ,IAAI,CAAC,YAAY,CAAC,CAClBe,IAAI,GAAGzB,EAAOb,YAAYR,EAAE6B,IAAIR,EAAOZ,UAAS,EAAG,CAAC;AAEvD"}
1
+ {"version":3,"file":"applyModelChange.js","names":["DataGridRow","GridModel","ReplicaSelectionModel","SchemaPropertiesMap","s","isEqual","coerceModelCellValue","getEmptyValue","ModelChange","type","rowIndex","rowData","count","updatedData","replicaId","selection","getDefaultValueForProperty","row","property","schemaPropertyInfo","info","Object","hasOwn","isRequired","applyModelChange","model","change","rowsArr","api","arr","columnNames","getSnapshot","map","name","con","ins","obj","data","vec","metadata","del","currentRowData","rows","entries","forEach","key","value","startsWith","colIndex","indexOf","coercedValue","rowVec","String","set","has","add"],"sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"sourcesContent":["import {\n DataGridRow,\n GridModel,\n ReplicaSelectionModel,\n} from '@/components/DataGrid/DataGridTypes'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { s } from 'json-joy/lib/json-crdt-patch'\nimport isEqual from 'lodash-es/isEqual'\nimport { coerceModelCellValue } from './schemaAwarePasteValue'\nimport { getEmptyValue } from './getEmptyValue'\n\n/**\n * Represents a change operation on the GridModel.\n */\nexport type ModelChange =\n | { type: 'CREATE'; rowIndex: number; rowData: DataGridRow }\n | { type: 'DELETE'; rowIndex: number; count?: number }\n | { type: 'UPDATE'; rowIndex: number; updatedData: DataGridRow }\n | {\n type: 'SET_SELECTION'\n replicaId: string\n selection: ReplicaSelectionModel\n }\n\nexport function getDefaultValueForProperty(\n row: DataGridRow,\n property: string,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const info = schemaPropertyInfo[property]\n if (Object.hasOwn(row, property)) {\n return coerceModelCellValue(row[property], info)\n }\n // Property absent from the row: derive the schema-correct blank directly.\n return getEmptyValue(info?.isRequired)\n}\n\n/**\n * Applies a single change operation (create, delete, or update) to the GridModel.\n *\n * @param model - The grid model to modify\n * @param change - The change to apply\n */\nexport function applyModelChange(\n model: GridModel,\n change: ModelChange,\n schemaPropertyInfo: SchemaPropertiesMap,\n) {\n const rowsArr = model.api.arr(['rows'])\n const { columnNames } = model.api.getSnapshot()\n\n switch (change.type) {\n case 'CREATE': {\n // Convert rowData object into a CRDT vector\n const rowData = columnNames.map(name =>\n s.con(\n getDefaultValueForProperty(change.rowData, name, schemaPropertyInfo),\n ),\n )\n // Insert a new row object at the specified index\n rowsArr?.ins(change.rowIndex, [\n s.obj({ data: s.vec(...rowData), metadata: s.obj({}) }),\n ])\n break\n }\n\n case 'DELETE':\n rowsArr?.del(change.rowIndex, change.count ?? 1)\n break\n\n case 'UPDATE': {\n const currentRowData = model.api.getSnapshot().rows[change.rowIndex]?.data\n Object.entries(change.updatedData).forEach(([key, value]) => {\n if (key.startsWith('_')) return // Skip internal properties like _rowId\n const colIndex = columnNames.indexOf(key)\n if (colIndex !== -1) {\n // Coerce empty values (null/undefined/\"\") to the schema-correct blank\n // so any path that reaches the model — paste, programmatic edits,\n // etc. — produces a value the validator can describe with its\n // standard \"<value> is not a valid …\" message format.\n const coercedValue = coerceModelCellValue(\n value,\n schemaPropertyInfo[key],\n )\n // Only write cells whose value actually changed to avoid stamping\n // the local replica's SID on unmodified cells.\n if (isEqual(currentRowData?.[colIndex], coercedValue)) return\n // Get the CRDT array of cell values for this row\n const rowVec = model.api.vec([\n 'rows',\n String(change.rowIndex),\n 'data',\n ])\n // Update the specific column with the new value\n rowVec?.set([[colIndex, s.con(coercedValue)]])\n }\n })\n break\n }\n case 'SET_SELECTION': {\n if (!model.api.obj().has('selection')) {\n // Create if not exists\n model.api.obj().add(['selection'], s.obj({}))\n }\n model.api\n .obj(['selection'])\n .set({ [change.replicaId]: s.con(change.selection) })\n\n break\n }\n }\n}\n"],"mappings":";;;;;AAwBA,SAAgBgB,EACdC,GACAC,GACAC,GACA;CACA,IAAMC,IAAOD,EAAmBD;AAKhC,QAJIG,OAAOC,OAAOL,GAAKC,EAAS,GACvBZ,EAAqBW,EAAIC,IAAWE,EAAK,GAG3Cb,EAAca,GAAMG,WAAW;;AASxC,SAAgBC,EACdC,GACAC,GACAP,GACA;CACA,IAAMQ,IAAUF,EAAMG,IAAIC,IAAI,CAAC,OAAO,CAAC,EACjC,EAAEC,mBAAgBL,EAAMG,IAAIG,aAAa;AAE/C,SAAQL,EAAOjB,MAAf;EACE,KAAK,UAAU;GAEb,IAAME,IAAUmB,EAAYE,KAAIC,MAC9B7B,EAAE8B,IACAlB,EAA2BU,EAAOf,SAASsB,GAAMd,EACnD,CACF,CAAC;AAEDQ,MAASQ,IAAIT,EAAOhB,UAAU,CAC5BN,EAAEgC,IAAI;IAAEC,MAAMjC,EAAEkC,IAAI,GAAG3B,EAAQ;IAAE4B,UAAUnC,EAAEgC,IAAI,EAAE,CAAA;IAAG,CAAC,CACxD,CAAC;AACF;;EAGF,KAAK;AACHT,MAASa,IAAId,EAAOhB,UAAUgB,EAAOd,SAAS,EAAE;AAChD;EAEF,KAAK,UAAU;GACb,IAAM6B,IAAiBhB,EAAMG,IAAIG,aAAa,CAACW,KAAKhB,EAAOhB,WAAW2B;AACtEhB,UAAOsB,QAAQjB,EAAOb,YAAY,CAAC+B,SAAS,CAACC,GAAKC,OAAW;AAC3D,QAAID,EAAIE,WAAW,IAAI,CAAE;IACzB,IAAMC,IAAWlB,EAAYmB,QAAQJ,EAAI;AACzC,QAAIG,MAAa,IAAI;KAKnB,IAAME,IAAe5C,EACnBwC,GACA3B,EAAmB0B,GACpB;AAGD,SAAIxC,EAAQoC,IAAiBO,IAAWE,EAAa,CAAE;AAExCzB,OAAMG,IAAIU,IAAI;MAC3B;MACAc,OAAO1B,EAAOhB,SAAS;MACvB;MACD,CAEDyC,EAAQE,IAAI,CAAC,CAACL,GAAU5C,EAAE8B,IAAIgB,EAAa,CAAC,CAAC,CAAC;;KAEhD;AACF;;EAEF,KAAK;AAKHzB,GAJKA,EAAMG,IAAIQ,KAAK,CAACkB,IAAI,YAAY,IAEnC7B,EAAMG,IAAIQ,KAAK,CAACmB,IAAI,CAAC,YAAY,EAAEnD,EAAEgC,IAAI,EAAE,CAAC,CAAC,EAE/CX,EAAMG,IACHQ,IAAI,CAAC,YAAY,CAAC,CAClBiB,IAAI,GAAG3B,EAAOZ,YAAYV,EAAE8B,IAAIR,EAAOX,UAAS,EAAG,CAAC;AAEvD"}
@@ -1,5 +1,6 @@
1
1
  import { EnumeratedValue } from '@/utils/jsonschema/getEnumeratedValues';
2
2
  import { FlatTypeInfo } from '@/utils/jsonschema/getType';
3
+ import { SchemaPropertyInfo } from '@/utils/jsonschema/getSchemaPropertyInfo';
3
4
  import { Column } from '@sage-bionetworks/react-datasheet-grid';
4
5
  type ColumnConfig = {
5
6
  columnName: string;
@@ -12,6 +13,13 @@ type ColumnConfig = {
12
13
  showPinIcon?: boolean;
13
14
  isPinned?: boolean;
14
15
  onTogglePin?: () => void;
16
+ /**
17
+ * Optional column-level schema info. When provided, paste behavior coerces
18
+ * empty pasted cells to the schema-correct blank (undefined for optional
19
+ * columns, null for required columns). Omit to preserve the column impl's
20
+ * default paste behavior.
21
+ */
22
+ schemaPropertyInfo?: SchemaPropertyInfo;
15
23
  };
16
24
  export declare function createColumn(config: ColumnConfig): Column;
17
25
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"columnFactory.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/columnFactory.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAGL,MAAM,EAIP,MAAM,wCAAwC,CAAA;AAqE/C,KAAK,YAAY,GAAG;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;IAC7B,gBAAgB,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;IACrD,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB,CAAA;AAkLD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGzD"}
1
+ {"version":3,"file":"columnFactory.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/columnFactory.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAC7E,OAAO,EAGL,MAAM,EAIP,MAAM,wCAAwC,CAAA;AAuE/C,KAAK,YAAY,GAAG;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;IAC7B,gBAAgB,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;IACrD,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC,CAAA;AAuLD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGzD"}