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.
- package/dist/SWC.index.js +1 -1
- package/dist/assets/icons/CloudWarning.d.ts +5 -0
- package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
- package/dist/assets/icons/CloudWarning.js +47 -0
- package/dist/assets/icons/CloudWarning.js.map +1 -0
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -44
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
- package/dist/components/Forum/DiscussionReply.d.ts +1 -0
- package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionReply.js +19 -19
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionThread.d.ts +1 -0
- package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionThread.js +73 -72
- package/dist/components/Forum/DiscussionThread.js.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.js +7 -3
- package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +2 -1
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +1 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +3 -0
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.d.ts +1 -0
- package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +19 -12
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts +1 -0
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js +2 -2
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js +15 -4
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- 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;
|
|
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
|
|
4
|
-
import { isNil as
|
|
5
|
-
import { Autocomplete as
|
|
6
|
-
import { jsx as
|
|
7
|
-
import { c as
|
|
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
|
|
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
|
|
25
|
-
return
|
|
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 =
|
|
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),
|
|
32
|
-
let y =
|
|
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),
|
|
38
|
+
}, s[2] = p, s[3] = b), ee(b);
|
|
36
39
|
let x;
|
|
37
|
-
s[4] === c ? x = s[5] : (x =
|
|
38
|
-
let S = x, [C,
|
|
39
|
-
s[6] !==
|
|
40
|
-
C !== S
|
|
41
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
50
|
-
!f && !m &&
|
|
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[
|
|
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[
|
|
58
|
-
let
|
|
59
|
-
s[
|
|
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[
|
|
69
|
+
}, s[22] = F, s[23] = I);
|
|
64
70
|
let L = m ? "visible" : "hidden", R;
|
|
65
|
-
s[
|
|
71
|
+
s[24] === L ? R = s[25] : (R = {
|
|
66
72
|
visibility: L,
|
|
67
73
|
pointerEvents: "auto"
|
|
68
|
-
}, s[
|
|
74
|
+
}, s[24] = L, s[25] = R);
|
|
69
75
|
let z = m ? "visible" : "hidden", B;
|
|
70
|
-
s[
|
|
76
|
+
s[26] === z ? B = s[27] : (B = {
|
|
71
77
|
visibility: z,
|
|
72
78
|
pointerEvents: "auto"
|
|
73
|
-
}, s[
|
|
79
|
+
}, s[26] = z, s[27] = B);
|
|
74
80
|
let V, H;
|
|
75
|
-
s[
|
|
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[
|
|
78
|
-
...
|
|
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[
|
|
90
|
+
}, s[30] = I, s[31] = R, s[32] = B, s[33] = U) : U = s[33];
|
|
85
91
|
let W = U, G;
|
|
86
|
-
s[
|
|
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[
|
|
89
|
-
let
|
|
90
|
-
s[
|
|
91
|
-
k(), r === "clear"
|
|
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[
|
|
95
|
-
let q = K, J = !
|
|
96
|
-
s[
|
|
97
|
-
|
|
98
|
-
}, s[
|
|
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[
|
|
111
|
+
s[40] === O ? Z = s[41] : (Z = { listbox: { onMouseDown: O } }, s[40] = O, s[41] = Z);
|
|
101
112
|
let Q;
|
|
102
|
-
s[
|
|
113
|
+
s[42] === D ? Q = s[43] : (Q = (e) => /* @__PURE__ */ i(ae, {
|
|
103
114
|
...e,
|
|
104
115
|
inputRef: D
|
|
105
|
-
}), s[
|
|
116
|
+
}), s[42] = D, s[43] = Q);
|
|
106
117
|
let $;
|
|
107
|
-
return s[
|
|
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:
|
|
127
|
+
getOptionLabel: ce,
|
|
117
128
|
value: Y,
|
|
118
129
|
inputValue: C,
|
|
119
130
|
onInputChange: X,
|
|
120
|
-
onKeyDown:
|
|
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[
|
|
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
|
|
130
|
-
return
|
|
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__ */
|
|
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,
|
|
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":";;;;;;;;AA2BA,IAAMmB,KAAuC;CAC3CC,OAAO;CACPC,QAAQ;CACR,2CAA2C;EACzCA,QAAQ;EACRC,SAAS;EACTC,iBAAiB;EACjBC,cAAc;EACf;CACD,gCAAgC;EAC9BF,SAAS;EACTC,iBAAiB;EAClB;CACD,0BAA0B,EAAEF,QAAQ,QAAO;CAC5C;AAkBD,SAAgBc,EAAsBC,GAAqB;AAOzD,QANI7B,GAAM6B,EAAO,GACR,KAEL,OAAOA,KAAW,WACbC,KAAKC,UAAUF,EAAO,GAExBG,OAAOH,EAAO;;AAGvB,SAAOI,EAAAC,GAAA;CAAA,IAAAC,IAAAC,GAAA,GAAA,EAA0B,EAAAd,YAAAC,eAAAE,YAAAC,YAAAW,UAAAC,gBAAAC,WAAAZ,YAAAa,MAAAN,GAQ/BP,IAAAa,MAAAC,KAAAA,IAAAA,KAAAA,IAAAD,GAKAE,IAAsBpC,GAAOiB,EAAW,EAAAoB;AACxCvC,CADwC+B,EAAA,OAAAZ,IAGvCoB,IAAAR,EAAA,MAFeQ,UAAA;AACdD,IAAaE,UAAWrB;IACzBY,EAAA,KAAAZ,GAAAY,EAAA,KAAAQ,IAFDvC,EAAgBuC,EAEd;CACF,IAAAE,IAAuBvC,GAAOgC,EAAY,EAAAQ;AAC1C1C,CAD0C+B,EAAA,OAAAG,IAGzCQ,IAAAX,EAAA,MAFeW,UAAA;AACdD,IAAcD,UAAWN;IAC1BH,EAAA,KAAAG,GAAAH,EAAA,KAAAW,IAFD1C,EAAgB0C,EAEd;CAAA,IAAAC;AAAA,CAAAZ,EAAA,OAAAb,IAEoDyB,IAAAZ,EAAA,MAA9BY,IAAAnB,EAAsBN,EAAQ,EAAAa,EAAA,KAAAb,GAAAa,EAAA,KAAAY;CAAtD,IAAAC,IAAwBD,GACxB,CAAAE,GAAAC,MACE3C,GAAiByC,EAAgB,EAAAG;AAAA,CAAAhB,EAAA,OAAAT,KAAAS,EAAA,OAAAc,KAAAd,EAAA,OAAAa,KAYnBG,UAAA;AACZ,EAAIF,MAAoBD,KAEtBN,EAAaE,QACXnD,EAAiCwD,GAAiBvB,EACpD,CAAC;IAEJS,EAAA,KAAAT,GAAAS,EAAA,KAAAc,GAAAd,EAAA,KAAAa,GAAAb,EAAA,KAAAgB,KAAAA,IAAAhB,EAAA;CAAA,IAAAiB;AAAA,CAAAjB,EAAA,QAAAI,KAAAJ,EAAA,QAAAG,KAAAH,EAAA,QAAAgB,KAV0BC,IAAA;EAAAb;EAAAD;EAAAe,cAGbF;EAQf,EAAAhB,EAAA,MAAAI,GAAAJ,EAAA,MAAAG,GAAAH,EAAA,MAAAgB,GAAAhB,EAAA,MAAAiB,KAAAA,IAAAjB,EAAA;CAlBD,IAAA,EAAAmB,eAAAC,aAAAC,2BAAAC,0BAAAC,mBAAAC,mBAOIhD,EAAyByC,EAW3B,EAAAQ,GAAAC;AAGF1D,CAHEgC,EAAA,QAAAI,KAAAJ,EAAA,QAAAE,KAAAF,EAAA,QAAAa,KAGQY,UAAA;AACR,EAAI,CAACvB,KAAD,CAAWE,KACbW,GAAmBF,EAAgB;IAEpCa,IAAA;EAACxB;EAAOE;EAAQS;EAAgB,EAAAb,EAAA,MAAAI,GAAAJ,EAAA,MAAAE,GAAAF,EAAA,MAAAa,GAAAb,EAAA,MAAAyB,GAAAzB,EAAA,MAAA0B,MAAAD,IAAAzB,EAAA,KAAA0B,IAAA1B,EAAA,MAJnChC,EAAUyD,GAIPC,EAAiC;CAAA,IAAAC;AAAA,CAAA3B,EAAA,QAAAb,IAEcwC,IAAA3B,EAAA,OAAjC2B,IAAA,CAAC9D,GAAMsB,EAA0B,IAAdA,MAAY,IAAEa,EAAA,MAAAb,GAAAa,EAAA,MAAA2B;CAAlD,IAAAC,KAAiBD,GASIE,IAAA3B,IAAAI,KAAAA,IAAA,QAA0BwB;AAAA,CAAA9B,EAAA,QAAA6B,IAC1CC,IAAA9B,EAAA,OAJ+B8B,IAAA;EAAAlD,SACrB;EAAQC,iBACA;EAASkD,eACXF;EAChB,EAAA7B,EAAA,MAAA6B,GAAA7B,EAAA,MAAA8B;CAEa,IAAAE,IAAA5B,IAAA,YAAA,UAA6B6B;AAAA,CAAAjC,EAAA,QAAAgC,IAE1CC,IAAAjC,EAAA,OAHoCiC,IAAA;EAAAC,YACvBF;EAA6BD,eAC1B;EAChB,EAAA/B,EAAA,MAAAgC,GAAAhC,EAAA,MAAAiC;CAEa,IAAAE,IAAA/B,IAAA,YAAA,UAA6BgC;AAAA,CAAApC,EAAA,QAAAmC,IAE1CC,IAAApC,EAAA,OAHoCoC,IAAA;EAAAF,YACvBC;EAA6BJ,eAC1B;EAChB,EAAA/B,EAAA,MAAAmC,GAAAnC,EAAA,MAAAoC;CAAA,IAAAC,GAAAC;AAAA,CAAAtC,EAAA,QAAAuC,OAAAC,IAAA,4BAAA,IAC0CH,IAAA,EAAAH,YAC7B,WACb,EAC0CI,IAAA,EAAAJ,YAC7B,WACb,EAAAlC,EAAA,MAAAqC,GAAArC,EAAA,MAAAsC,MAAAD,IAAArC,EAAA,KAAAsC,IAAAtC,EAAA;CAAA,IAAAyC;AAAA,CAAAzC,EAAA,QAAA8B,KAAA9B,EAAA,QAAAiC,KAAAjC,EAAA,QAAAoC,KApBIK,IAAA;EAAA,GACFhE;EAAoB,gCACSqD;EAI/B,qCACoCG;EAGpC,qCACoCG;EAGpC,2CAC0CC;EAE1C,2CAC0CC;EAG5C,EAAAtC,EAAA,MAAA8B,GAAA9B,EAAA,MAAAiC,GAAAjC,EAAA,MAAAoC,GAAApC,EAAA,MAAAyC,KAAAA,IAAAzC,EAAA;CAtBH,IAAA0C,IACSD,GAuBRE;AAAA,CAAA3C,EAAA,QAAAuC,OAAAC,IAAA,4BAAA,IAEiCG,KAAAC,MAAA;AAChC,EAAIA,EAACC,QAAS,SACZD,EAACE,gBAAiB,EAClBpC,EAAcD,QAAS,EAAAsC,SAAW,IAAO,CAAC,IACjCH,EAACC,QAAS,YACnBD,EAACE,gBAAiB,EAClBpC,EAAcD,QAAS,EAAAsC,SAAW,IAAM,CAAC;IAE5C/C,EAAA,MAAA2C,KAAAA,IAAA3C,EAAA;CARD,IAAAgD,KAAsBL,GAQhBM;AAAA,CAAAjD,EAAA,QAAAR,KAAAQ,EAAA,QAAAT,KAAAS,EAAA,QAAAsB,KAGJ2B,KAAAC,GAAAC,GAAAC,MAAA;AAgBEC,EAXA/B,GAAuB,EACnB8B,MAAW,UACb7C,EAAaE,QAASjB,EAAW,GACxB4D,MAAW,iBAEpB7C,EAAaE,QACXnD,EAAiC6F,GAAkB5D,EACrD,CAAC,GAEDgB,EAAaE,QAAS0C,EAA6B,EAErDE,iBAAW;AACT3C,KAAcD,QAAS,EAAAsC,SAAW,IAAO,CAAC;KACzC,EAAE;IACN/C,EAAA,MAAAR,GAAAQ,EAAA,MAAAT,GAAAS,EAAA,MAAAsB,GAAAtB,EAAA,MAAAiD,KAAAA,IAAAjD,EAAA;CApBH,IAAAsD,IAAqBL,GA6BCM,IAAA,CAAC3B,IAMZ4B,IAAArE,GAA6BsE;AAAA,CAAAzD,EAAA,QAAAuC,OAAAC,IAAA,4BAAA,IAErBiB,KAAAC,GAAAC,MAAA;AACb5C,KAAmB4C,EAAc;IAClC3D,EAAA,MAAAyD,KAAAA,IAAAzD,EAAA;CAAA,IAAA4D;AAAA,CAAA5D,EAAA,QAAAqB,IAOAuC,IAAA5D,EAAA,OAFU4D,IAAA,EAAAC,SACA,EAAAC,aAAezC,GAAuB,EAChD,EAAArB,EAAA,MAAAqB,GAAArB,EAAA,MAAA4D;CAAA,IAAAG;AAAA,CAAA/D,EAAA,QAAAoB,IACmE2C,IAAA/D,EAAA,OAAvD+D,KAAAC,MAAU,kBAAC,IAAD;EAAU,GAAKA;EAAkB5C;EAAY,CAAA,EAAApB,EAAA,MAAAoB,GAAApB,EAAA,MAAA+D;CAAA,IAAAE;AAEpE,QAFoEjE,EAAA,QAAA0C,KAAA1C,EAAA,QAAAV,KAAAU,EAAA,QAAAsD,KAAAtD,EAAA,QAAAwB,KAAAxB,EAAA,QAAAuB,KAAAvB,EAAA,QAAAc,KAAAd,EAAA,QAAAmB,KAAAnB,EAAA,QAAAuD,KAAAvD,EAAA,QAAAwD,KAAAxD,EAAA,QAAA4D,KAAA5D,EAAA,QAAA+D,KAtBtEE,IAAA,kBAAC,IAAD;EACQ9C,MAAAA;EACEI,QAAAA;EACQ,gBAAA;EACE,kBAAAgC;EACR,UAAA;EACK,eAAA;EACNjE,SAAAA;EACT,eAAA;EACgB,gBAAA4E;EACT,OAAAV;EACK1C,YAAAA;EACG,eAAA2C;EAGJT,WAAAA;EACFxB,SAAAA;EACC8B,UAAAA;EACI,cAAA;EACH,WAAAM;EAGE,aAAAG;EACTrB,IAAAA;EACJ,CAAA,EAAA1C,EAAA,MAAA0C,GAAA1C,EAAA,MAAAV,GAAAU,EAAA,MAAAsD,GAAAtD,EAAA,MAAAwB,GAAAxB,EAAA,MAAAuB,GAAAvB,EAAA,MAAAc,GAAAd,EAAA,MAAAmB,GAAAnB,EAAA,MAAAuD,GAAAvD,EAAA,MAAAwD,GAAAxD,EAAA,MAAA4D,GAAA5D,EAAA,MAAA+D,GAAA/D,EAAA,MAAAiE,KAAAA,IAAAjE,EAAA,KAxBFiE;;AArHG,SAAAC,GAAAC,GAAA;AAAA,QA8HyB1E,EAAsB0E,EAAO;;AAuB7D,SAAgBC,EACdC,GACAC,GACA;AACA,QACED,EAAUlF,YAAYmF,EAAUnF,WAChCkF,EAAU/E,YAAYgF,EAAUhF,WAChC+E,EAAU9E,YAAY+E,EAAU/E,WAChC8E,EAAUnE,UAAUoE,EAAUpE,SAC9BmE,EAAUjE,WAAWkE,EAAUlE,UAC/BiE,EAAU7E,eAAe8E,EAAU9E;;AAIvC,IAAa+E,IAA2BzG,EACtCgC,GACAsE,EACD;AAOD,SAAgBK,EAAmB,EACjCnF,YACAC,YACAC,iBAC2C;AAC3C,QAAO;EACLmF,aAAaC,MACX,kBAAC,GAAD;GACE,GAAIA;GACKtF;GACAC;GACGC;GAEf,CAAA;EAEDsF,YAAY,EAAE3F,iBAAcA;EAC5B4F,aAAa,EAAE1F,eAAYA;EAC3B2F,aAAa;EACbC,WAAW;EACZ"}
|
|
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,
|
|
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):
|
|
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;
|
|
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 "
|
|
2
|
-
import {
|
|
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
|
|
5
|
-
let r;
|
|
6
|
-
return
|
|
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
|
|
9
|
-
let
|
|
10
|
-
switch (
|
|
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 =
|
|
13
|
-
|
|
14
|
-
data:
|
|
15
|
-
metadata:
|
|
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
|
-
|
|
22
|
+
s?.del(a.rowIndex, a.count ?? 1);
|
|
21
23
|
break;
|
|
22
24
|
case "UPDATE": {
|
|
23
|
-
let
|
|
24
|
-
Object.entries(
|
|
25
|
-
if (
|
|
26
|
-
let
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
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(
|
|
34
|
+
String(a.rowIndex),
|
|
32
35
|
"data"
|
|
33
|
-
])?.set([[
|
|
36
|
+
])?.set([[u, r.con(c)]]);
|
|
34
37
|
}
|
|
35
38
|
});
|
|
36
39
|
break;
|
|
37
40
|
}
|
|
38
41
|
case "SET_SELECTION":
|
|
39
|
-
|
|
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 {
|
|
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","
|
|
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;
|
|
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"}
|