synapse-react-client 4.0.10 → 4.0.12
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.d.ts +1 -1
- 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/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts +44 -0
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts.map +1 -0
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js +46 -0
- package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.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/DownloadCartPage.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js +183 -185
- package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
- 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/EntityAclEditor/EntityAclEditor.js +8 -8
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityAclEditor/InheritanceMessage.d.ts.map +1 -1
- package/dist/components/EntityAclEditor/InheritanceMessage.js +1 -2
- package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
- 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/FullTextSearch/FullTextSearch.d.ts.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearch.js +86 -47
- package/dist/components/FullTextSearch/FullTextSearch.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/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +157 -157
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/HeaderCard.d.ts.map +1 -1
- package/dist/components/HeaderCard.js +131 -130
- package/dist/components/HeaderCard.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/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts +4 -1
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts.map +1 -1
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js +3 -2
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
- package/dist/components/QueryContext/QueryContext.d.ts +6 -0
- package/dist/components/QueryContext/QueryContext.d.ts.map +1 -1
- package/dist/components/QueryContext/QueryContext.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +12 -11
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +5 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +32 -29
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js +4 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +59 -0
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -0
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +174 -0
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +40 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +100 -0
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +56 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +73 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -0
- package/dist/components/ShareThisPage/ShareThisPage.js +1 -1
- package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.js +20 -14
- package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts +3 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +51 -36
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +8 -7
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
- package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +16 -0
- package/dist/components/SynapseHomepageV2/WordPressNews.d.ts +3 -1
- package/dist/components/SynapseHomepageV2/WordPressNews.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNews.js +9 -8
- package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts +2 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.js +2 -2
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
- package/dist/components/SynapseTable/SearchV2.d.ts +7 -0
- package/dist/components/SynapseTable/SearchV2.d.ts.map +1 -1
- package/dist/components/SynapseTable/SearchV2.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js +6 -5
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/ToastMessage/ToastMessage.d.ts +1 -1
- package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
- package/dist/components/ToastMessage/ToastMessage.js +2 -2
- package/dist/components/ToastMessage/ToastMessage.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/components/error/ErrorPage.d.ts +0 -4
- package/dist/components/error/ErrorPage.d.ts.map +1 -1
- package/dist/components/error/ErrorPage.js +25 -30
- package/dist/components/error/ErrorPage.js.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +41 -39
- package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js +2 -2
- package/dist/components/widgets/query-filter/FacetFilterControls.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/index.js +52 -50
- package/dist/index.js.map +1 -1
- package/dist/mocks/entity/index.d.ts.map +1 -1
- package/dist/mocks/entity/index.js +18 -16
- package/dist/mocks/entity/index.js.map +1 -1
- package/dist/mocks/mockSearchQueryData.d.ts +14 -0
- package/dist/mocks/mockSearchQueryData.d.ts.map +1 -0
- package/dist/mocks/mockSearchQueryData.js +564 -0
- package/dist/mocks/mockSearchQueryData.js.map +1 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts +22 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.js +63 -0
- package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers.js +9 -7
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/style/components/_cards.scss +15 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.d.ts +7 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +422 -417
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-client/index.js +3 -3
- package/dist/synapse-queries/KeyFactory.d.ts +3 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +6 -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 +3 -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/dist/utils/functions/calculateFriendlyFileSize.d.ts.map +1 -1
- package/dist/utils/functions/calculateFriendlyFileSize.js +3 -3
- package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
- package/package.json +3 -3
|
@@ -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"}
|
|
@@ -3,21 +3,23 @@ import { autocompleteColumn as t } from "../columns/AutocompleteColumn.js";
|
|
|
3
3
|
import { autocompleteMultipleEnumColumn as n } from "../columns/AutocompleteMultipleEnumColumn.js";
|
|
4
4
|
import { calculateDefaultColumnWidth as r } from "./calculateColumnWidth.js";
|
|
5
5
|
import { ColumnHeaderWithTooltip as i } from "../components/ColumnHeaderWithTooltip.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { c as u } from "react/
|
|
10
|
-
import {
|
|
6
|
+
import { getEmptyValue as a } from "./getEmptyValue.js";
|
|
7
|
+
import { wrapPasteValueWithSchemaCoercion as o } from "./schemaAwarePasteValue.js";
|
|
8
|
+
import { Tooltip as s } from "@mui/material";
|
|
9
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
10
|
+
import { SmartToyTwoTone as d } from "@mui/icons-material";
|
|
11
|
+
import { c as f } from "react/compiler-runtime";
|
|
12
|
+
import { createTextColumn as p, floatColumn as m, keyColumn as h } from "@sage-bionetworks/react-datasheet-grid";
|
|
11
13
|
//#region src/components/DataGrid/utils/columnFactory.tsx
|
|
12
|
-
function
|
|
14
|
+
function g(e, t) {
|
|
13
15
|
function n(n) {
|
|
14
|
-
let r =
|
|
15
|
-
r[0] === n ?
|
|
16
|
+
let r = f(13), i = n.rowData.__cellChangeInfo?.[t], a = i?.category === "own-agent" || i?.category === "other-agent", o;
|
|
17
|
+
r[0] === n ? o = r[1] : (o = /* @__PURE__ */ l(e, { ...n }), r[0] = n, r[1] = o);
|
|
16
18
|
let p;
|
|
17
|
-
r[2] !== i || r[3] !==
|
|
19
|
+
r[2] !== i || r[3] !== a ? (p = i && !a && /* @__PURE__ */ l(s, {
|
|
18
20
|
title: i.tooltipText,
|
|
19
21
|
placement: "top-end",
|
|
20
|
-
children: /* @__PURE__ */
|
|
22
|
+
children: /* @__PURE__ */ l("div", { style: {
|
|
21
23
|
position: "absolute",
|
|
22
24
|
top: 0,
|
|
23
25
|
right: 0,
|
|
@@ -26,12 +28,12 @@ function m(e, t) {
|
|
|
26
28
|
zIndex: 21,
|
|
27
29
|
pointerEvents: "auto"
|
|
28
30
|
} })
|
|
29
|
-
}), r[2] = i, r[3] =
|
|
31
|
+
}), r[2] = i, r[3] = a, r[4] = p) : p = r[4];
|
|
30
32
|
let m;
|
|
31
|
-
r[5] !== i || r[6] !==
|
|
33
|
+
r[5] !== i || r[6] !== a || r[7] !== n.focus ? (m = a && !n.focus && /* @__PURE__ */ l(s, {
|
|
32
34
|
title: i.tooltipText,
|
|
33
35
|
placement: "left",
|
|
34
|
-
children: /* @__PURE__ */
|
|
36
|
+
children: /* @__PURE__ */ l(d, { sx: {
|
|
35
37
|
fontSize: "1em",
|
|
36
38
|
alignSelf: "center",
|
|
37
39
|
flexShrink: 0,
|
|
@@ -41,73 +43,74 @@ function m(e, t) {
|
|
|
41
43
|
color: "grey.400",
|
|
42
44
|
backgroundColor: "transparent"
|
|
43
45
|
} })
|
|
44
|
-
}), r[5] = i, r[6] =
|
|
46
|
+
}), r[5] = i, r[6] = a, r[7] = n.focus, r[8] = m) : m = r[8];
|
|
45
47
|
let h;
|
|
46
|
-
return r[9] !==
|
|
47
|
-
|
|
48
|
+
return r[9] !== o || r[10] !== p || r[11] !== m ? (h = /* @__PURE__ */ u(c, { children: [
|
|
49
|
+
o,
|
|
48
50
|
p,
|
|
49
51
|
m
|
|
50
|
-
] }), r[9] =
|
|
52
|
+
] }), r[9] = o, r[10] = p, r[11] = m, r[12] = h) : h = r[12], h;
|
|
51
53
|
}
|
|
52
54
|
return n.displayName = `CellWithTooltip(${t})`, n;
|
|
53
55
|
}
|
|
54
|
-
function
|
|
56
|
+
function _(e) {
|
|
55
57
|
return e ? "header-cell-required" : "header-cell";
|
|
56
58
|
}
|
|
57
|
-
function
|
|
59
|
+
function v(e, t) {
|
|
58
60
|
return ({ rowData: n }) => ({
|
|
59
61
|
...n,
|
|
60
|
-
[e]: t
|
|
62
|
+
[e]: a(t)
|
|
61
63
|
});
|
|
62
64
|
}
|
|
63
|
-
function
|
|
65
|
+
function y(e) {
|
|
64
66
|
return (t) => {
|
|
65
67
|
let n = t.trim();
|
|
66
|
-
return n === "" ? e
|
|
68
|
+
return n === "" ? a(e) : n;
|
|
67
69
|
};
|
|
68
70
|
}
|
|
69
|
-
function
|
|
71
|
+
function b(e, t) {
|
|
70
72
|
let n = {
|
|
71
73
|
showPinIcon: e.showPinIcon,
|
|
72
74
|
hasDescription: !!e.description
|
|
73
|
-
}, a = e.customWidth ?? r(e.columnName, void 0, n),
|
|
75
|
+
}, a = e.customWidth ?? r(e.columnName, void 0, n), s = h(e.columnName, t);
|
|
74
76
|
return {
|
|
75
|
-
...
|
|
76
|
-
component:
|
|
77
|
-
title: /* @__PURE__ */
|
|
77
|
+
...s,
|
|
78
|
+
component: g(s.component, e.columnName),
|
|
79
|
+
title: /* @__PURE__ */ l(i, {
|
|
78
80
|
name: e.columnName,
|
|
79
81
|
description: e.description,
|
|
80
82
|
showPinIcon: e.showPinIcon,
|
|
81
83
|
isPinned: e.isPinned,
|
|
82
84
|
onTogglePin: e.onTogglePin
|
|
83
85
|
}),
|
|
84
|
-
headerClassName:
|
|
86
|
+
headerClassName: _(e.isRequired),
|
|
85
87
|
minWidth: a,
|
|
86
88
|
basis: a,
|
|
87
89
|
grow: 0,
|
|
88
90
|
shrink: 0,
|
|
89
91
|
disabled: e.disabled,
|
|
90
|
-
deleteValue:
|
|
92
|
+
deleteValue: v(e.columnName, e.isRequired),
|
|
93
|
+
pasteValue: o(s.pasteValue, e.columnName, e.schemaPropertyInfo),
|
|
91
94
|
stickyLeft: e.isPinned
|
|
92
95
|
};
|
|
93
96
|
}
|
|
94
|
-
var
|
|
95
|
-
multipleEnum: (e) =>
|
|
97
|
+
var x = {
|
|
98
|
+
multipleEnum: (e) => b(e, n({
|
|
96
99
|
choices: e.enumeratedValues ?? [],
|
|
97
100
|
colType: e.typeInfo?.type || null,
|
|
98
101
|
limitTags: 3,
|
|
99
|
-
clearValue: e.isRequired
|
|
102
|
+
clearValue: a(e.isRequired)
|
|
100
103
|
})),
|
|
101
|
-
boolean: (e) =>
|
|
104
|
+
boolean: (e) => b(e, t({
|
|
102
105
|
choices: [!0, !1],
|
|
103
106
|
colType: "boolean",
|
|
104
|
-
clearValue: e.isRequired
|
|
107
|
+
clearValue: a(e.isRequired)
|
|
105
108
|
})),
|
|
106
|
-
number: (e) =>
|
|
107
|
-
enumerated: (e) =>
|
|
109
|
+
number: (e) => b(e, m),
|
|
110
|
+
enumerated: (e) => b(e, t({
|
|
108
111
|
choices: e.enumeratedValues ?? [],
|
|
109
112
|
colType: e.typeInfo?.type || null,
|
|
110
|
-
clearValue: e.isRequired
|
|
113
|
+
clearValue: a(e.isRequired)
|
|
111
114
|
})),
|
|
112
115
|
"date-time": (t) => {
|
|
113
116
|
let n = e({ colType: t.typeInfo?.type || null }), i = {
|
|
@@ -119,27 +122,27 @@ var y = {
|
|
|
119
122
|
enumeratedValues: null
|
|
120
123
|
}, i);
|
|
121
124
|
return {
|
|
122
|
-
...
|
|
125
|
+
...b(t, n),
|
|
123
126
|
minWidth: a,
|
|
124
127
|
basis: a
|
|
125
128
|
};
|
|
126
129
|
},
|
|
127
130
|
text: (e) => ({
|
|
128
|
-
...
|
|
131
|
+
...b(e, p({
|
|
129
132
|
continuousUpdates: !1,
|
|
130
133
|
deletedValue: void 0,
|
|
131
|
-
parseUserInput:
|
|
134
|
+
parseUserInput: y(e.isRequired)
|
|
132
135
|
})),
|
|
133
136
|
cellClassName: "MuiInputBase-input"
|
|
134
137
|
})
|
|
135
138
|
};
|
|
136
|
-
function
|
|
139
|
+
function S(e, t) {
|
|
137
140
|
return e ? e.format === "date-time" ? "date-time" : e.isArray ? "multipleEnum" : e.type === "boolean" ? "boolean" : e.type === "number" || e.type === "integer" ? "number" : t && t.length > 0 ? "enumerated" : "text" : t && t.length > 0 ? "enumerated" : "text";
|
|
138
141
|
}
|
|
139
|
-
function
|
|
140
|
-
return
|
|
142
|
+
function C(e) {
|
|
143
|
+
return x[S(e.typeInfo, e.enumeratedValues)](e);
|
|
141
144
|
}
|
|
142
145
|
//#endregion
|
|
143
|
-
export {
|
|
146
|
+
export { C as createColumn };
|
|
144
147
|
|
|
145
148
|
//# sourceMappingURL=columnFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnFactory.js","names":["dateTimeColumn","EnumeratedValue","FlatTypeInfo","CellComponent","CellProps","Column","createTextColumn","floatColumn","keyColumn","autocompleteColumn","autocompleteMultipleEnumColumn","calculateDefaultColumnWidth","HeaderOptions","ColumnHeaderWithTooltip","Tooltip","SmartToyTwoTone","DataGridRow","withChangeIndicatorTooltip","OriginalComponent","T","C","colName","CellWithTooltip","props","$","_c","changeInfo","rowData","__cellChangeInfo","isAgent","category","t0","t1","tooltipText","position","top","right","width","height","zIndex","pointerEvents","t2","focus","fontSize","alignSelf","flexShrink","mr","color","backgroundColor","t3","displayName","ColumnConfig","columnName","description","disabled","typeInfo","enumeratedValues","isRequired","customWidth","showPinIcon","isPinned","onTogglePin","getHeaderClassName","createDeleteValue","Record","undefined","createParseUserInput","value","trimmedValue","trim","createBaseColumn","config","columnImpl","headerOptions","hasDescription","keyed","component","title","headerClassName","minWidth","basis","grow","shrink","deleteValue","stickyLeft","COLUMN_FACTORIES","multipleEnum","choices","colType","type","limitTags","clearValue","boolean","number","enumerated","date-time","text","continuousUpdates","deletedValue","parseUserInput","cellClassName","getColumnType","length","format","isArray","createColumn","columnType"],"sources":["../../../../src/components/DataGrid/utils/columnFactory.tsx"],"sourcesContent":["import { dateTimeColumn } from '@/components/DataGrid/columns/DateTimeColumn'\nimport { EnumeratedValue } from '@/utils/jsonschema/getEnumeratedValues'\nimport { FlatTypeInfo } from '@/utils/jsonschema/getType'\nimport {\n CellComponent,\n CellProps,\n Column,\n createTextColumn,\n floatColumn,\n keyColumn,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { autocompleteColumn } from '../columns/AutocompleteColumn'\nimport { autocompleteMultipleEnumColumn } from '../columns/AutocompleteMultipleEnumColumn'\nimport {\n calculateDefaultColumnWidth,\n HeaderOptions,\n} from './calculateColumnWidth'\nimport { ColumnHeaderWithTooltip } from '../components/ColumnHeaderWithTooltip'\nimport { Tooltip } from '@mui/material'\nimport { SmartToyTwoTone } from '@mui/icons-material'\nimport type { DataGridRow } from '../DataGridTypes'\n\n/**\n * Wraps a column cell component to overlay change-attribution indicators:\n * - Non-agent changes: invisible 7×7px tooltip trigger over the CSS triangle (top-right).\n * - Agent changes: robot icon (1em, vertically centered on the right) with no triangle.\n */\nfunction withChangeIndicatorTooltip<T, C>(\n OriginalComponent: CellComponent<T, C>,\n colName: string,\n): CellComponent<T, C> {\n function CellWithTooltip(props: CellProps<T, C>) {\n const changeInfo = (props.rowData as DataGridRow).__cellChangeInfo?.[\n colName\n ]\n const isAgent =\n changeInfo?.category === 'own-agent' ||\n changeInfo?.category === 'other-agent'\n return (\n <>\n <OriginalComponent {...props} />\n {changeInfo && !isAgent && (\n <Tooltip title={changeInfo.tooltipText} placement=\"top-end\">\n <div\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: 7,\n height: 7,\n zIndex: 21,\n pointerEvents: 'auto',\n }}\n />\n </Tooltip>\n )}\n {isAgent && !props.focus && (\n <Tooltip title={changeInfo.tooltipText} placement=\"left\">\n <SmartToyTwoTone\n sx={{\n fontSize: '1em',\n alignSelf: 'center',\n flexShrink: 0,\n mr: 0.5,\n zIndex: 21,\n pointerEvents: 'auto',\n color: 'grey.400',\n backgroundColor: 'transparent',\n }}\n />\n </Tooltip>\n )}\n </>\n )\n }\n CellWithTooltip.displayName = `CellWithTooltip(${colName})`\n return CellWithTooltip\n}\n\ntype ColumnConfig = {\n columnName: string\n description?: string\n disabled?: boolean\n typeInfo: FlatTypeInfo | null\n enumeratedValues: EnumeratedValue[] | string[] | null\n isRequired: boolean\n customWidth?: number\n showPinIcon?: boolean\n isPinned?: boolean\n onTogglePin?: () => void\n}\n\nfunction getHeaderClassName(isRequired: boolean): string {\n return isRequired ? 'header-cell-required' : 'header-cell'\n}\n\nfunction createDeleteValue(columnName: string, isRequired?: boolean) {\n return ({ rowData }: { rowData: Record<string, unknown> }) => ({\n ...rowData,\n [columnName]: isRequired ? null : undefined,\n })\n}\n\nfunction createParseUserInput(isRequired?: boolean) {\n return (value: string) => {\n const trimmedValue = value.trim()\n if (trimmedValue === '') {\n return isRequired ? null : undefined\n }\n return trimmedValue\n }\n}\n\nfunction createBaseColumn(config: ColumnConfig, columnImpl: any) {\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n undefined, // propertyInfo is not available here, passed from higher level\n headerOptions,\n )\n\n const keyed = keyColumn(config.columnName, columnImpl)\n return {\n ...keyed,\n component: withChangeIndicatorTooltip(keyed.component!, config.columnName),\n title: (\n <ColumnHeaderWithTooltip\n name={config.columnName}\n description={config.description}\n showPinIcon={config.showPinIcon}\n isPinned={config.isPinned}\n onTogglePin={config.onTogglePin}\n />\n ),\n headerClassName: getHeaderClassName(config.isRequired),\n minWidth: width,\n basis: width,\n grow: 0,\n shrink: 0,\n disabled: config.disabled,\n deleteValue: createDeleteValue(config.columnName, config.isRequired),\n stickyLeft: config.isPinned,\n }\n}\n\nconst COLUMN_FACTORIES = {\n multipleEnum: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteMultipleEnumColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n limitTags: 3,\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n boolean: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: [true, false],\n colType: 'boolean',\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n number: (config: ColumnConfig) => {\n return createBaseColumn(config, floatColumn)\n },\n\n enumerated: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n 'date-time': (config: ColumnConfig) => {\n const columnImpl = dateTimeColumn({\n colType: config.typeInfo?.type || null,\n })\n\n // Date-time needs special width calculation\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n {\n type: config.typeInfo ?? undefined,\n isRequired: config.isRequired,\n enumeratedValues: null,\n },\n headerOptions,\n )\n\n return {\n ...createBaseColumn(config, columnImpl),\n minWidth: width,\n basis: width,\n }\n },\n\n text: (config: ColumnConfig) => {\n const columnImpl = createTextColumn({\n continuousUpdates: false,\n deletedValue: undefined,\n parseUserInput: createParseUserInput(config.isRequired),\n })\n\n return {\n ...createBaseColumn(config, columnImpl),\n cellClassName: 'MuiInputBase-input',\n }\n },\n}\n\nfunction getColumnType(\n typeInfo: FlatTypeInfo | null,\n enumeratedValues?: EnumeratedValue[] | string[] | null,\n): keyof typeof COLUMN_FACTORIES {\n if (!typeInfo) {\n return enumeratedValues && enumeratedValues.length > 0\n ? 'enumerated'\n : 'text'\n }\n\n if (typeInfo.format === 'date-time') {\n return 'date-time'\n }\n\n // Handle arrays - check if it's an array of enums\n if (typeInfo.isArray) {\n return 'multipleEnum'\n }\n\n if (typeInfo.type === 'boolean') {\n return 'boolean'\n }\n\n if (typeInfo.type === 'number' || typeInfo.type === 'integer') {\n return 'number'\n }\n\n if (enumeratedValues && enumeratedValues.length > 0) {\n return 'enumerated'\n }\n\n return 'text'\n}\n\nexport function createColumn(config: ColumnConfig): Column {\n const columnType = getColumnType(config.typeInfo, config.enumeratedValues)\n return COLUMN_FACTORIES[columnType](config)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"columnFactory.js","names":["dateTimeColumn","EnumeratedValue","FlatTypeInfo","SchemaPropertyInfo","CellComponent","CellProps","Column","createTextColumn","floatColumn","keyColumn","autocompleteColumn","autocompleteMultipleEnumColumn","calculateDefaultColumnWidth","HeaderOptions","ColumnHeaderWithTooltip","Tooltip","SmartToyTwoTone","DataGridRow","wrapPasteValueWithSchemaCoercion","getEmptyValue","withChangeIndicatorTooltip","OriginalComponent","T","C","colName","CellWithTooltip","props","$","_c","changeInfo","rowData","__cellChangeInfo","isAgent","category","t0","t1","tooltipText","position","top","right","width","height","zIndex","pointerEvents","t2","focus","fontSize","alignSelf","flexShrink","mr","color","backgroundColor","t3","displayName","ColumnConfig","columnName","description","disabled","typeInfo","enumeratedValues","isRequired","customWidth","showPinIcon","isPinned","onTogglePin","schemaPropertyInfo","getHeaderClassName","createDeleteValue","Record","createParseUserInput","value","trimmedValue","trim","createBaseColumn","config","columnImpl","headerOptions","hasDescription","undefined","keyed","component","title","headerClassName","minWidth","basis","grow","shrink","deleteValue","pasteValue","stickyLeft","COLUMN_FACTORIES","multipleEnum","choices","colType","type","limitTags","clearValue","boolean","number","enumerated","date-time","text","continuousUpdates","deletedValue","parseUserInput","cellClassName","getColumnType","length","format","isArray","createColumn","columnType"],"sources":["../../../../src/components/DataGrid/utils/columnFactory.tsx"],"sourcesContent":["import { dateTimeColumn } from '@/components/DataGrid/columns/DateTimeColumn'\nimport { EnumeratedValue } from '@/utils/jsonschema/getEnumeratedValues'\nimport { FlatTypeInfo } from '@/utils/jsonschema/getType'\nimport { SchemaPropertyInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport {\n CellComponent,\n CellProps,\n Column,\n createTextColumn,\n floatColumn,\n keyColumn,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { autocompleteColumn } from '../columns/AutocompleteColumn'\nimport { autocompleteMultipleEnumColumn } from '../columns/AutocompleteMultipleEnumColumn'\nimport {\n calculateDefaultColumnWidth,\n HeaderOptions,\n} from './calculateColumnWidth'\nimport { ColumnHeaderWithTooltip } from '../components/ColumnHeaderWithTooltip'\nimport { Tooltip } from '@mui/material'\nimport { SmartToyTwoTone } from '@mui/icons-material'\nimport type { DataGridRow } from '../DataGridTypes'\nimport { wrapPasteValueWithSchemaCoercion } from './schemaAwarePasteValue'\nimport { getEmptyValue } from './getEmptyValue'\n\n/**\n * Wraps a column cell component to overlay change-attribution indicators:\n * - Non-agent changes: invisible 7×7px tooltip trigger over the CSS triangle (top-right).\n * - Agent changes: robot icon (1em, vertically centered on the right) with no triangle.\n */\nfunction withChangeIndicatorTooltip<T, C>(\n OriginalComponent: CellComponent<T, C>,\n colName: string,\n): CellComponent<T, C> {\n function CellWithTooltip(props: CellProps<T, C>) {\n const changeInfo = (props.rowData as DataGridRow).__cellChangeInfo?.[\n colName\n ]\n const isAgent =\n changeInfo?.category === 'own-agent' ||\n changeInfo?.category === 'other-agent'\n return (\n <>\n <OriginalComponent {...props} />\n {changeInfo && !isAgent && (\n <Tooltip title={changeInfo.tooltipText} placement=\"top-end\">\n <div\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: 7,\n height: 7,\n zIndex: 21,\n pointerEvents: 'auto',\n }}\n />\n </Tooltip>\n )}\n {isAgent && !props.focus && (\n <Tooltip title={changeInfo.tooltipText} placement=\"left\">\n <SmartToyTwoTone\n sx={{\n fontSize: '1em',\n alignSelf: 'center',\n flexShrink: 0,\n mr: 0.5,\n zIndex: 21,\n pointerEvents: 'auto',\n color: 'grey.400',\n backgroundColor: 'transparent',\n }}\n />\n </Tooltip>\n )}\n </>\n )\n }\n CellWithTooltip.displayName = `CellWithTooltip(${colName})`\n return CellWithTooltip\n}\n\ntype ColumnConfig = {\n columnName: string\n description?: string\n disabled?: boolean\n typeInfo: FlatTypeInfo | null\n enumeratedValues: EnumeratedValue[] | string[] | null\n isRequired: boolean\n customWidth?: number\n showPinIcon?: boolean\n isPinned?: boolean\n onTogglePin?: () => void\n /**\n * Optional column-level schema info. When provided, paste behavior coerces\n * empty pasted cells to the schema-correct blank (undefined for optional\n * columns, null for required columns). Omit to preserve the column impl's\n * default paste behavior.\n */\n schemaPropertyInfo?: SchemaPropertyInfo\n}\n\nfunction getHeaderClassName(isRequired: boolean): string {\n return isRequired ? 'header-cell-required' : 'header-cell'\n}\n\nfunction createDeleteValue(columnName: string, isRequired?: boolean) {\n return ({ rowData }: { rowData: Record<string, unknown> }) => ({\n ...rowData,\n [columnName]: getEmptyValue(isRequired),\n })\n}\n\nfunction createParseUserInput(isRequired?: boolean) {\n return (value: string) => {\n const trimmedValue = value.trim()\n if (trimmedValue === '') {\n return getEmptyValue(isRequired)\n }\n return trimmedValue\n }\n}\n\nfunction createBaseColumn(config: ColumnConfig, columnImpl: any) {\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n undefined, // propertyInfo is not available here, passed from higher level\n headerOptions,\n )\n\n const keyed = keyColumn(config.columnName, columnImpl)\n return {\n ...keyed,\n component: withChangeIndicatorTooltip(keyed.component!, config.columnName),\n title: (\n <ColumnHeaderWithTooltip\n name={config.columnName}\n description={config.description}\n showPinIcon={config.showPinIcon}\n isPinned={config.isPinned}\n onTogglePin={config.onTogglePin}\n />\n ),\n headerClassName: getHeaderClassName(config.isRequired),\n minWidth: width,\n basis: width,\n grow: 0,\n shrink: 0,\n disabled: config.disabled,\n deleteValue: createDeleteValue(config.columnName, config.isRequired),\n pasteValue: wrapPasteValueWithSchemaCoercion(\n keyed.pasteValue,\n config.columnName,\n config.schemaPropertyInfo,\n ),\n stickyLeft: config.isPinned,\n }\n}\n\nconst COLUMN_FACTORIES = {\n multipleEnum: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteMultipleEnumColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n limitTags: 3,\n clearValue: getEmptyValue(config.isRequired),\n }),\n )\n },\n\n boolean: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: [true, false],\n colType: 'boolean',\n clearValue: getEmptyValue(config.isRequired),\n }),\n )\n },\n\n number: (config: ColumnConfig) => {\n return createBaseColumn(config, floatColumn)\n },\n\n enumerated: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n clearValue: getEmptyValue(config.isRequired),\n }),\n )\n },\n\n 'date-time': (config: ColumnConfig) => {\n const columnImpl = dateTimeColumn({\n colType: config.typeInfo?.type || null,\n })\n\n // Date-time needs special width calculation\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n {\n type: config.typeInfo ?? undefined,\n isRequired: config.isRequired,\n enumeratedValues: null,\n },\n headerOptions,\n )\n\n return {\n ...createBaseColumn(config, columnImpl),\n minWidth: width,\n basis: width,\n }\n },\n\n text: (config: ColumnConfig) => {\n const columnImpl = createTextColumn({\n continuousUpdates: false,\n deletedValue: undefined,\n parseUserInput: createParseUserInput(config.isRequired),\n })\n\n return {\n ...createBaseColumn(config, columnImpl),\n cellClassName: 'MuiInputBase-input',\n }\n },\n}\n\nfunction getColumnType(\n typeInfo: FlatTypeInfo | null,\n enumeratedValues?: EnumeratedValue[] | string[] | null,\n): keyof typeof COLUMN_FACTORIES {\n if (!typeInfo) {\n return enumeratedValues && enumeratedValues.length > 0\n ? 'enumerated'\n : 'text'\n }\n\n if (typeInfo.format === 'date-time') {\n return 'date-time'\n }\n\n // Handle arrays - check if it's an array of enums\n if (typeInfo.isArray) {\n return 'multipleEnum'\n }\n\n if (typeInfo.type === 'boolean') {\n return 'boolean'\n }\n\n if (typeInfo.type === 'number' || typeInfo.type === 'integer') {\n return 'number'\n }\n\n if (enumeratedValues && enumeratedValues.length > 0) {\n return 'enumerated'\n }\n\n return 'text'\n}\n\nexport function createColumn(config: ColumnConfig): Column {\n const columnType = getColumnType(config.typeInfo, config.enumeratedValues)\n return COLUMN_FACTORIES[columnType](config)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEmptyValue.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/getEmptyValue.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,oBAEjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEmptyValue.js","names":[],"sources":["../../../../src/components/DataGrid/utils/getEmptyValue.ts"],"sourcesContent":["export function getEmptyValue(isRequired?: boolean) {\n return isRequired ? null : undefined\n}\n"],"mappings":";AAAA,SAAgB,EAAc,GAAsB;AAClD,QAAO,IAAa,OAAO,KAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelColsToGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/modelColsToGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAE9E,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,oBAAoB,EAAE,mBAAmB,EACzC,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACzC,aAAa,GAAE,GAAG,CAAC,MAAM,CAAa,EACtC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAC1C,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"modelColsToGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/modelColsToGrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAE9E,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,oBAAoB,EAAE,mBAAmB,EACzC,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACzC,aAAa,GAAE,GAAG,CAAC,MAAM,CAAa,EACtC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAC1C,MAAM,EAAE,CAuBV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelColsToGrid.js","names":["Column","createColumn","SchemaPropertiesMap","modelColsToGrid","columnNames","columnOrder","schemaPropertiesInfo","columnWidths","Record","pinnedColumns","Set","onTogglePin","columnIndex","map","index","arrayIndex","columnName","propertyInfo","showPinIcon","undefined","isPinned","has","description","typeInfo","type","enumeratedValues","isRequired","disabled","readOnly","customWidth"],"sources":["../../../../src/components/DataGrid/utils/modelColsToGrid.ts"],"sourcesContent":["import { Column } from '@sage-bionetworks/react-datasheet-grid'\nimport { createColumn } from './columnFactory'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\n\nexport function modelColsToGrid(\n columnNames: string[],\n columnOrder: number[],\n schemaPropertiesInfo: SchemaPropertiesMap,\n columnWidths: Record<string, number> = {},\n pinnedColumns: Set<number> = new Set(),\n onTogglePin?: (columnIndex: number) => void,\n): Column[] {\n return columnOrder.map((index: number, arrayIndex: number) => {\n const columnName = columnNames[index]\n const propertyInfo = schemaPropertiesInfo[columnName]\n\n // Only show pin functionality for the first column and when toggle handler exists\n const showPinIcon = arrayIndex === 0 && onTogglePin !== undefined\n const isPinned = pinnedColumns.has(arrayIndex)\n\n return createColumn({\n columnName,\n description: propertyInfo?.description,\n typeInfo: propertyInfo?.type || null,\n enumeratedValues: propertyInfo?.enumeratedValues || [],\n isRequired: propertyInfo?.isRequired || false,\n disabled: propertyInfo?.type?.readOnly,\n customWidth: columnWidths[columnName],\n showPinIcon,\n isPinned,\n onTogglePin: onTogglePin ? () => onTogglePin(arrayIndex) : undefined,\n })\n })\n}\n"],"mappings":";;AAIA,SAAgBG,EACdC,GACAC,GACAC,GACAC,IAAuC,EAAE,EACzCE,oBAA6B,IAAIC,KAAK,EACtCC,GACU;AACV,QAAON,EAAYQ,KAAKC,GAAeC,MAAuB;EAC5D,IAAMC,IAAaZ,EAAYU,IACzBG,IAAeX,EAAqBU,IAGpCE,IAAcH,MAAe,KAAKJ,MAAgBQ,KAAAA,GAClDC,IAAWX,EAAcY,IAAIN,EAAW;AAE9C,SAAOd,EAAa;GAClBe;GACAM,aAAaL,GAAcK;GAC3BC,UAAUN,GAAcO,QAAQ;GAChCC,kBAAkBR,GAAcQ,oBAAoB,EAAE;GACtDC,YAAYT,GAAcS,cAAc;GACxCC,UAAUV,GAAcO,MAAMI;GAC9BC,aAAatB,EAAaS;GAC1BE;GACAE;GACAT,aAAaA,UAAoBA,EAAYI,EAAW,GAAGI,KAAAA;
|
|
1
|
+
{"version":3,"file":"modelColsToGrid.js","names":["Column","createColumn","SchemaPropertiesMap","modelColsToGrid","columnNames","columnOrder","schemaPropertiesInfo","columnWidths","Record","pinnedColumns","Set","onTogglePin","columnIndex","map","index","arrayIndex","columnName","propertyInfo","showPinIcon","undefined","isPinned","has","description","typeInfo","type","enumeratedValues","isRequired","disabled","readOnly","customWidth","schemaPropertyInfo"],"sources":["../../../../src/components/DataGrid/utils/modelColsToGrid.ts"],"sourcesContent":["import { Column } from '@sage-bionetworks/react-datasheet-grid'\nimport { createColumn } from './columnFactory'\nimport { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo'\n\nexport function modelColsToGrid(\n columnNames: string[],\n columnOrder: number[],\n schemaPropertiesInfo: SchemaPropertiesMap,\n columnWidths: Record<string, number> = {},\n pinnedColumns: Set<number> = new Set(),\n onTogglePin?: (columnIndex: number) => void,\n): Column[] {\n return columnOrder.map((index: number, arrayIndex: number) => {\n const columnName = columnNames[index]\n const propertyInfo = schemaPropertiesInfo[columnName]\n\n // Only show pin functionality for the first column and when toggle handler exists\n const showPinIcon = arrayIndex === 0 && onTogglePin !== undefined\n const isPinned = pinnedColumns.has(arrayIndex)\n\n return createColumn({\n columnName,\n description: propertyInfo?.description,\n typeInfo: propertyInfo?.type || null,\n enumeratedValues: propertyInfo?.enumeratedValues || [],\n isRequired: propertyInfo?.isRequired || false,\n disabled: propertyInfo?.type?.readOnly,\n customWidth: columnWidths[columnName],\n showPinIcon,\n isPinned,\n onTogglePin: onTogglePin ? () => onTogglePin(arrayIndex) : undefined,\n schemaPropertyInfo: propertyInfo,\n })\n })\n}\n"],"mappings":";;AAIA,SAAgBG,EACdC,GACAC,GACAC,GACAC,IAAuC,EAAE,EACzCE,oBAA6B,IAAIC,KAAK,EACtCC,GACU;AACV,QAAON,EAAYQ,KAAKC,GAAeC,MAAuB;EAC5D,IAAMC,IAAaZ,EAAYU,IACzBG,IAAeX,EAAqBU,IAGpCE,IAAcH,MAAe,KAAKJ,MAAgBQ,KAAAA,GAClDC,IAAWX,EAAcY,IAAIN,EAAW;AAE9C,SAAOd,EAAa;GAClBe;GACAM,aAAaL,GAAcK;GAC3BC,UAAUN,GAAcO,QAAQ;GAChCC,kBAAkBR,GAAcQ,oBAAoB,EAAE;GACtDC,YAAYT,GAAcS,cAAc;GACxCC,UAAUV,GAAcO,MAAMI;GAC9BC,aAAatB,EAAaS;GAC1BE;GACAE;GACAT,aAAaA,UAAoBA,EAAYI,EAAW,GAAGI,KAAAA;GAC3DW,oBAAoBb;GACrB,CAAC;GACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Column } from '@sage-bionetworks/react-datasheet-grid';
|
|
2
|
+
import type { SchemaPropertyInfo } from '@/utils/jsonschema/getSchemaPropertyInfo';
|
|
3
|
+
/**
|
|
4
|
+
* Coerce an empty cell value to the schema-correct blank before it reaches
|
|
5
|
+
* the model, regardless of how the edit originated (paste, free-typed commit,
|
|
6
|
+
* programmatic CREATE/UPDATE, etc.).
|
|
7
|
+
*
|
|
8
|
+
* - Optional columns -> undefined (property is absent and passes validation
|
|
9
|
+
* for any optional type).
|
|
10
|
+
* - Required columns -> null (validator surfaces a substantive error the
|
|
11
|
+
* user can act on).
|
|
12
|
+
*
|
|
13
|
+
* "Empty" means null, undefined, or a whitespace-only string. Spreadsheet
|
|
14
|
+
* clipboard formats (text/html in particular) can encode visually empty
|
|
15
|
+
* cells as runs of `\n` from stacked `<br>` tags, so the trim check covers
|
|
16
|
+
* those alongside literal "". Empty arrays are not coerced because some
|
|
17
|
+
* columns (e.g. multi-enum) emit [] from their own paste logic and that is
|
|
18
|
+
* the desired in-model representation.
|
|
19
|
+
*
|
|
20
|
+
* If schemaPropertyInfo is omitted, the original value is returned unchanged.
|
|
21
|
+
*/
|
|
22
|
+
export declare function coerceModelCellValue(value: unknown, schemaPropertyInfo?: SchemaPropertyInfo): unknown;
|
|
23
|
+
type PasteValueFn<T, PasteValue> = NonNullable<Column<T, unknown, PasteValue>['pasteValue']>;
|
|
24
|
+
/**
|
|
25
|
+
* Wraps a keyed column's `pasteValue` so that an empty pasted cell is coerced
|
|
26
|
+
* to the schema-correct blank for the column. If `schemaPropertyInfo` is
|
|
27
|
+
* omitted (e.g. the grid is rendered without a JSON schema), the original
|
|
28
|
+
* paste behavior is preserved.
|
|
29
|
+
*/
|
|
30
|
+
export declare function wrapPasteValueWithSchemaCoercion<T extends Record<string, unknown>, PasteValue>(originalPasteValue: PasteValueFn<T, PasteValue> | undefined, columnName: string, schemaPropertyInfo?: SchemaPropertyInfo): PasteValueFn<T, PasteValue> | undefined;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=schemaAwarePasteValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAwarePasteValue.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/schemaAwarePasteValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAA;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAA;AAGlF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,kBAAkB,CAAC,EAAE,kBAAkB,GACtC,OAAO,CAYT;AAED,KAAK,YAAY,CAAC,CAAC,EAAE,UAAU,IAAI,WAAW,CAC5C,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,YAAY,CAAC,CAC7C,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,EAEV,kBAAkB,EAAE,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,SAAS,EAC3D,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,kBAAkB,GACtC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,SAAS,CAazC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getEmptyValue as e } from "./getEmptyValue.js";
|
|
2
|
+
//#region src/components/DataGrid/utils/schemaAwarePasteValue.ts
|
|
3
|
+
function t(t, n) {
|
|
4
|
+
return n && (t == null || typeof t == "string" && t.trim() === "") ? e(n.isRequired) : t;
|
|
5
|
+
}
|
|
6
|
+
function n(e, n, r) {
|
|
7
|
+
return !e || !r ? e : ({ rowData: i, value: a, rowIndex: o }) => {
|
|
8
|
+
let s = e({
|
|
9
|
+
rowData: i,
|
|
10
|
+
value: a,
|
|
11
|
+
rowIndex: o
|
|
12
|
+
}), c = s[n], l = t(c, r);
|
|
13
|
+
return l === c ? s : {
|
|
14
|
+
...s,
|
|
15
|
+
[n]: l
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { t as coerceModelCellValue, n as wrapPasteValueWithSchemaCoercion };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=schemaAwarePasteValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAwarePasteValue.js","names":["Column","SchemaPropertyInfo","getEmptyValue","coerceModelCellValue","value","schemaPropertyInfo","undefined","trim","isRequired","PasteValueFn","NonNullable","T","PasteValue","wrapPasteValueWithSchemaCoercion","Record","originalPasteValue","columnName","rowData","rowIndex","result","cellValue","coerced"],"sources":["../../../../src/components/DataGrid/utils/schemaAwarePasteValue.ts"],"sourcesContent":["import type { Column } from '@sage-bionetworks/react-datasheet-grid'\nimport type { SchemaPropertyInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { getEmptyValue } from './getEmptyValue'\n\n/**\n * Coerce an empty cell value to the schema-correct blank before it reaches\n * the model, regardless of how the edit originated (paste, free-typed commit,\n * programmatic CREATE/UPDATE, etc.).\n *\n * - Optional columns -> undefined (property is absent and passes validation\n * for any optional type).\n * - Required columns -> null (validator surfaces a substantive error the\n * user can act on).\n *\n * \"Empty\" means null, undefined, or a whitespace-only string. Spreadsheet\n * clipboard formats (text/html in particular) can encode visually empty\n * cells as runs of `\\n` from stacked `<br>` tags, so the trim check covers\n * those alongside literal \"\". Empty arrays are not coerced because some\n * columns (e.g. multi-enum) emit [] from their own paste logic and that is\n * the desired in-model representation.\n *\n * If schemaPropertyInfo is omitted, the original value is returned unchanged.\n */\nexport function coerceModelCellValue(\n value: unknown,\n schemaPropertyInfo?: SchemaPropertyInfo,\n): unknown {\n if (!schemaPropertyInfo) {\n return value\n }\n if (\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return getEmptyValue(schemaPropertyInfo.isRequired)\n }\n return value\n}\n\ntype PasteValueFn<T, PasteValue> = NonNullable<\n Column<T, unknown, PasteValue>['pasteValue']\n>\n\n/**\n * Wraps a keyed column's `pasteValue` so that an empty pasted cell is coerced\n * to the schema-correct blank for the column. If `schemaPropertyInfo` is\n * omitted (e.g. the grid is rendered without a JSON schema), the original\n * paste behavior is preserved.\n */\nexport function wrapPasteValueWithSchemaCoercion<\n T extends Record<string, unknown>,\n PasteValue,\n>(\n originalPasteValue: PasteValueFn<T, PasteValue> | undefined,\n columnName: string,\n schemaPropertyInfo?: SchemaPropertyInfo,\n): PasteValueFn<T, PasteValue> | undefined {\n if (!originalPasteValue || !schemaPropertyInfo) {\n return originalPasteValue\n }\n return ({ rowData, value, rowIndex }) => {\n const result = originalPasteValue({ rowData, value, rowIndex })\n const cellValue = result[columnName]\n const coerced = coerceModelCellValue(cellValue, schemaPropertyInfo)\n if (coerced === cellValue) {\n return result\n }\n return { ...result, [columnName]: coerced } as T\n }\n}\n"],"mappings":";;AAuBA,SAAgBG,EACdC,GACAC,GACS;AAWT,QAVKA,MAIHD,KAAU,QAET,OAAOA,KAAU,YAAYA,EAAMG,MAAM,KAAK,MAExCL,EAAcG,EAAmBG,WAAW,GAE9CJ;;AAaT,SAAgBS,EAIdE,GACAC,GACAX,GACyC;AAIzC,QAHI,CAACU,KAAsB,CAACV,IACnBU,KAED,EAAEE,YAASb,UAAOc,kBAAe;EACvC,IAAMC,IAASJ,EAAmB;GAAEE;GAASb;GAAOc;GAAU,CAAC,EACzDE,IAAYD,EAAOH,IACnBK,IAAUlB,EAAqBiB,GAAWf,EAAmB;AAInE,SAHIgB,MAAYD,IACPD,IAEF;GAAE,GAAGA;IAASH,IAAaK;GAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadCartPage.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadCart/DownloadCartPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DownloadCartPage.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadCart/DownloadCartPage.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAEL,gCAAgC,EACjC,MAAM,+BAA+B,CAAA;AActC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gCAAgC,2CAyevE;AAED,eAAe,gBAAgB,CAAA"}
|