synapse-react-client 4.0.20 → 4.0.22
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 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +2 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/components/CardContainer/CardConfiguration.d.ts +2 -0
- package/dist/components/CardContainer/CardConfiguration.d.ts.map +1 -1
- package/dist/components/CardContainer/CardContainer.d.ts.map +1 -1
- package/dist/components/CardContainer/CardContainer.js +44 -50
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +14 -0
- package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.js +64 -40
- package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.css +1 -1
- package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
- package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.module.scss +26 -7
- package/dist/components/DataGrid/DataGrid.d.ts +1 -0
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGrid.js +72 -72
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +209 -206
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts +6 -3
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts.map +1 -1
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js +54 -46
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +68 -67
- package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts +1 -0
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +5 -3
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js +15 -14
- package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts +7 -0
- package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/normalizeWebsocketError.js +8 -0
- package/dist/components/DataGrid/utils/normalizeWebsocketError.js.map +1 -0
- package/dist/components/GenericCard/GenericCard.d.ts +2 -0
- package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +76 -64
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +33 -25
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/Goals/Goals.d.ts +8 -0
- package/dist/components/Goals/Goals.d.ts.map +1 -1
- package/dist/components/Goals/Goals.js +54 -40
- package/dist/components/Goals/Goals.js.map +1 -1
- package/dist/components/Plot/SynapseSankeyPlot.css +1 -0
- package/dist/components/Plot/SynapseSankeyPlot.d.ts +44 -2
- package/dist/components/Plot/SynapseSankeyPlot.d.ts.map +1 -1
- package/dist/components/Plot/SynapseSankeyPlot.js +343 -38
- package/dist/components/Plot/SynapseSankeyPlot.js.map +1 -1
- package/dist/components/Plot/SynapseSankeyPlot.module.js +15 -0
- package/dist/components/Plot/SynapseSankeyPlot.module.js.map +1 -0
- package/dist/components/Plot/SynapseSankeyPlot.module.scss +63 -0
- package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts +9 -0
- package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts.map +1 -0
- package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js +69 -0
- package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js.map +1 -0
- package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts +13 -0
- package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts.map +1 -0
- package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js +11 -0
- package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js.map +1 -0
- package/dist/components/ProjectVisibilityChip/index.d.ts +5 -0
- package/dist/components/ProjectVisibilityChip/index.d.ts.map +1 -0
- package/dist/components/ProjectVisibilityChip/index.js +7 -0
- package/dist/components/ProjectVisibilityChip/index.js.map +1 -0
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/RowSetView.js +9 -12
- package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.d.ts +7 -15
- package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.js +114 -123
- package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +13 -12
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +88 -77
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +63 -74
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +72 -68
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +27 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js +47 -36
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.d.ts +12 -12
- package/dist/components/TableColumnSchemaEditor/Validators/BooleanSchema.d.ts +4 -1
- package/dist/components/TableColumnSchemaEditor/Validators/BooleanSchema.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.d.ts +167 -517
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js +65 -65
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DoubleSchema.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DoubleSchema.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DoubleSchema.js +6 -13
- package/dist/components/TableColumnSchemaEditor/Validators/DoubleSchema.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/EntityIdSchema.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/EntityIdSchema.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/IntegerSchema.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/IntegerSchema.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/IntegerSchema.js +2 -2
- package/dist/components/TableColumnSchemaEditor/Validators/IntegerSchema.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/OptionalStringSchema.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/OptionalStringSchema.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/getZodSchemaForColumnType.d.ts +2 -2
- package/dist/components/TableColumnSchemaEditor/Validators/getZodSchemaForColumnType.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/getZodSchemaForColumnType.js +15 -16
- package/dist/components/TableColumnSchemaEditor/Validators/getZodSchemaForColumnType.js.map +1 -1
- package/dist/components/UserCardList/UserCardList.d.ts +2 -20
- package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
- package/dist/components/UserCardList/UserCardList.js +49 -72
- package/dist/components/UserCardList/UserCardList.js.map +1 -1
- package/dist/components/UserCardList/UserCardListRotate.d.ts +13 -0
- package/dist/components/UserCardList/UserCardListRotate.d.ts.map +1 -1
- package/dist/components/UserCardList/UserCardListRotate.js +82 -57
- package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
- package/dist/mocks/mockSearchQueryData.js +2 -2
- package/dist/mocks/mockSearchQueryData.js.map +1 -1
- package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts +1 -1
- package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/searchQueryHandlers.js +6 -3
- package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -1
- package/dist/mocks/query/mockUserCardTableQueryResultBundle.d.ts +13 -0
- package/dist/mocks/query/mockUserCardTableQueryResultBundle.d.ts.map +1 -1
- package/dist/mocks/query/mockUserCardTableQueryResultBundle.js +27 -0
- package/dist/mocks/query/mockUserCardTableQueryResultBundle.js.map +1 -1
- package/dist/style/abstracts/_cssVariables.scss +1 -0
- package/dist/style/components/_cards.scss +10 -0
- package/dist/style/components/_data-grid-extra.css +1 -1
- package/dist/style/components/_data-grid-extra.scss +7 -1
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +497 -495
- package/dist/synapse-client/SynapseClient.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/index.js +46 -44
- package/dist/synapse-queries/user/index.js +3 -3
- package/dist/synapse-queries/user/useUserBundle.d.ts +12 -0
- package/dist/synapse-queries/user/useUserBundle.d.ts.map +1 -1
- package/dist/synapse-queries/user/useUserBundle.js +50 -36
- package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts +10 -5
- package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/SessionInitializedGuard.js +13 -9
- package/dist/utils/AppUtils/session/SessionInitializedGuard.js.map +1 -1
- package/dist/utils/functions/SqlFunctions.d.ts +1 -1
- package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
- package/dist/utils/functions/SqlFunctions.js +1 -1
- package/dist/utils/functions/SqlFunctions.js.map +1 -1
- package/package.json +7 -5
|
@@ -63,7 +63,8 @@ function p(e) {
|
|
|
63
63
|
case a.BOOLEAN_LIST:
|
|
64
64
|
case a.DATE_LIST:
|
|
65
65
|
case a.INTEGER_LIST:
|
|
66
|
-
case a.ENTITYID_LIST:
|
|
66
|
+
case a.ENTITYID_LIST:
|
|
67
|
+
case a.USERID_LIST: return !0;
|
|
67
68
|
default: return !1;
|
|
68
69
|
}
|
|
69
70
|
}
|
|
@@ -94,32 +95,42 @@ function m(e, t) {
|
|
|
94
95
|
}
|
|
95
96
|
return n && !t && (n = [void 0, ...n]), n;
|
|
96
97
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
98
|
+
var h = [
|
|
99
|
+
a.ENTITYID,
|
|
100
|
+
a.ENTITYID_LIST,
|
|
101
|
+
a.EVALUATIONID,
|
|
102
|
+
a.FILEHANDLEID,
|
|
103
|
+
a.LARGETEXT,
|
|
104
|
+
a.MEDIUMTEXT,
|
|
105
|
+
a.SUBMISSIONID,
|
|
106
|
+
a.USERID,
|
|
107
|
+
a.USERID_LIST
|
|
108
|
+
];
|
|
109
|
+
function g(e, t, n) {
|
|
110
|
+
return t || n ? !1 : !h.includes(e);
|
|
111
|
+
}
|
|
112
|
+
var _ = 50, v = 1e3, y = 100, b = 256, x = 100, S = 1e5, C = {
|
|
113
|
+
[a.INTEGER_LIST]: 20,
|
|
114
|
+
[a.DATE_LIST]: 20,
|
|
115
|
+
[a.USERID_LIST]: 20,
|
|
116
|
+
[a.BOOLEAN_LIST]: 5,
|
|
117
|
+
[a.ENTITYID_LIST]: 44
|
|
118
|
+
};
|
|
119
|
+
function w(e) {
|
|
115
120
|
switch (e) {
|
|
116
121
|
case a.STRING:
|
|
117
122
|
case a.STRING_LIST:
|
|
118
|
-
case a.LINK: return
|
|
123
|
+
case a.LINK: return v;
|
|
119
124
|
default: throw Error(`Type is not known to have a max size: ${e}`);
|
|
120
125
|
}
|
|
121
126
|
}
|
|
122
|
-
function
|
|
127
|
+
function T(e, t) {
|
|
128
|
+
if (e === a.STRING_LIST) return Math.floor(S / (t ?? 50));
|
|
129
|
+
let n = C[e];
|
|
130
|
+
if (n == null) throw Error(`Type is not known to have a max list length: ${e}`);
|
|
131
|
+
return Math.floor(S / n);
|
|
132
|
+
}
|
|
133
|
+
function E(e, t) {
|
|
123
134
|
if (t) return !1;
|
|
124
135
|
switch (e) {
|
|
125
136
|
case a.STRING:
|
|
@@ -128,10 +139,10 @@ function b(e, t) {
|
|
|
128
139
|
default: return !1;
|
|
129
140
|
}
|
|
130
141
|
}
|
|
131
|
-
function
|
|
142
|
+
function D(e, t) {
|
|
132
143
|
return t === a.INTEGER ? e.map((e) => parseInt(e)) : e;
|
|
133
144
|
}
|
|
134
|
-
function
|
|
145
|
+
function O(e, t = []) {
|
|
135
146
|
return e.map((e) => ({
|
|
136
147
|
...e,
|
|
137
148
|
columnType: e.columnType,
|
|
@@ -145,10 +156,10 @@ function S(e, t = []) {
|
|
|
145
156
|
isSelected: !1
|
|
146
157
|
})) : void 0,
|
|
147
158
|
defaultValue: e.defaultValue && e.columnType.endsWith("_LIST") ? JSON.parse(e.defaultValue) : e.defaultValue,
|
|
148
|
-
enumValues: e.enumValues == null ? void 0 :
|
|
159
|
+
enumValues: e.enumValues == null ? void 0 : D(e.enumValues, e.columnType)
|
|
149
160
|
}));
|
|
150
161
|
}
|
|
151
|
-
function
|
|
162
|
+
function k(a) {
|
|
152
163
|
if (r(a)) return {
|
|
153
164
|
scope: a.scopeIds,
|
|
154
165
|
viewTypeMask: a.viewTypeMask,
|
|
@@ -167,7 +178,7 @@ function C(a) {
|
|
|
167
178
|
viewEntityType: e(a.concreteType)
|
|
168
179
|
};
|
|
169
180
|
}
|
|
170
|
-
function
|
|
181
|
+
function A(e) {
|
|
171
182
|
switch (e) {
|
|
172
183
|
case a.STRING:
|
|
173
184
|
case a.STRING_LIST: return {
|
|
@@ -201,29 +212,29 @@ function w(e) {
|
|
|
201
212
|
};
|
|
202
213
|
}
|
|
203
214
|
}
|
|
204
|
-
var
|
|
215
|
+
var j = (e, t) => e.name === t.name && e.columnType === t.columnType, M = (e, t) => {
|
|
205
216
|
let n;
|
|
206
|
-
for (let r of e) if (
|
|
217
|
+
for (let r of e) if (j(r, t)) {
|
|
207
218
|
n = r;
|
|
208
219
|
break;
|
|
209
220
|
}
|
|
210
221
|
return n;
|
|
211
222
|
};
|
|
212
|
-
function
|
|
223
|
+
function N(e) {
|
|
213
224
|
let t = e === null ? null : parseFloat(String(e));
|
|
214
225
|
return Number.isInteger(t) ? t : null;
|
|
215
226
|
}
|
|
216
|
-
var
|
|
217
|
-
let n =
|
|
227
|
+
var P = (e, t) => {
|
|
228
|
+
let n = N(e);
|
|
218
229
|
return t != null && n != null && n > 0 ? n < t : !1;
|
|
219
230
|
};
|
|
220
|
-
function
|
|
221
|
-
return t ? !(
|
|
231
|
+
function F(e, t) {
|
|
232
|
+
return t ? !(P(e.maximumSize, t.maximumSize) || P(e.maximumListLength, t.maximumListLength)) : !0;
|
|
222
233
|
}
|
|
223
|
-
function
|
|
224
|
-
return e.filter((e) => !
|
|
234
|
+
function I(e, t) {
|
|
235
|
+
return e.filter((e) => !F(e, M(t, e))).length;
|
|
225
236
|
}
|
|
226
237
|
//#endregion
|
|
227
|
-
export {
|
|
238
|
+
export { y as DEFAULT_LIST_LENGTH, _ as DEFAULT_STRING_SIZE, h as DISALLOWED_DEFAULT_VALUE_COLUMN_TYPES, S as LIST_LENGTH_CHARACTER_BUDGET, b as MAX_COLUMN_NAME_LENGTH, x as MAX_ENUM_VALUES, v as MAX_STRING_SIZE, g as canHaveDefault, p as canHaveMaxListLength, E as canHaveRestrictedValues, f as canHaveSize, m as configureFacetsForType, F as doesColumnModelSatisfyAnnotationMinimums, M as findMatchingColumnModel, l as getAllowedColumnTypes, d as getColumnTypeFriendlyName, u as getFacetTypeFriendlyName, N as getFormDataValueAsNumber, A as getJsonSchemaItemDefinitionForColumnType, T as getMaxListLengthForType, w as getMaxSizeForType, I as getNumberOfColumnModelsWithValuesBelowMinimumRecommendedSizes, k as getViewScopeForEntity, P as isFormDataValueSmallerThanRecommendedValue, O as transformColumnModelsToFormData };
|
|
228
239
|
|
|
229
240
|
//# sourceMappingURL=TableColumnSchemaEditorUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableColumnSchemaEditorUtils.js","names":[],"sources":["../../../src/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.ts"],"sourcesContent":["import {\n convertToEntityType,\n isDataset,\n isDatasetCollection,\n isEntityView,\n isSubmissionView,\n} from '@/utils/functions/EntityTypeUtils'\nimport { ViewEntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ColumnModel,\n ColumnType,\n ColumnTypeEnum,\n Entity,\n ENTITY_VIEW_TYPE_MASK_DATASET,\n ENTITY_VIEW_TYPE_MASK_FILE,\n FacetType,\n ViewScope,\n} from '@sage-bionetworks/synapse-types'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { SetOptional } from 'type-fest'\nimport {\n ColumnModelFormData,\n JsonSubColumnModelFormData,\n} from './Validators/ColumnModelValidator'\n\n/**\n * These column types can only be used in Tables. They can not be used in views.\n * See SWC-6333 - for views, only allow column types that are mapped to annotation types.\n */\nconst unsupportedTypesForViews = [ColumnTypeEnum.JSON]\n\n/**\n * Get the allowed column types for a column model based on the table type.\n * @param isView - whether the base table is a view\n * @param isJsonSubColumnFacet - whether the proposed column is a JSON subcolumn facet\n */\nexport function getAllowedColumnTypes(\n isView: boolean,\n isJsonSubColumnFacet: boolean,\n): ColumnTypeEnum[] {\n return Object.values(ColumnTypeEnum)\n .filter(columnType =>\n isView ? !unsupportedTypesForViews.includes(columnType) : true,\n )\n .filter(columnType => {\n if (isJsonSubColumnFacet) {\n switch (columnType) {\n // JSON Subcolumns cannot be JSON or LIST types\n case ColumnTypeEnum.JSON:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.INTEGER_LIST:\n case ColumnTypeEnum.BOOLEAN_LIST:\n case ColumnTypeEnum.DATE_LIST:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.ENTITYID_LIST:\n return false\n default:\n return true\n }\n }\n return true\n })\n}\n\nexport function getFacetTypeFriendlyName(facetType: FacetType) {\n switch (facetType) {\n case 'enumeration':\n return 'Values'\n case 'range':\n return 'Range'\n default:\n return facetType\n }\n}\nexport function getColumnTypeFriendlyName(type: ColumnType | ColumnTypeEnum) {\n switch (type) {\n case ColumnTypeEnum.STRING:\n return 'String'\n case ColumnTypeEnum.DOUBLE:\n return 'Double'\n case ColumnTypeEnum.BOOLEAN:\n return 'Boolean'\n case ColumnTypeEnum.INTEGER:\n return 'Integer'\n case ColumnTypeEnum.DATE:\n return 'Date'\n case ColumnTypeEnum.FILEHANDLEID:\n return 'File'\n case ColumnTypeEnum.ENTITYID:\n return 'Entity'\n case ColumnTypeEnum.LINK:\n return 'Link'\n case ColumnTypeEnum.MEDIUMTEXT:\n return 'MediumText'\n case ColumnTypeEnum.LARGETEXT:\n return 'LargeText'\n case ColumnTypeEnum.USERID:\n return 'User'\n case ColumnTypeEnum.STRING_LIST:\n return 'String List'\n case ColumnTypeEnum.INTEGER_LIST:\n return 'Integer List'\n case ColumnTypeEnum.BOOLEAN_LIST:\n return 'Boolean List'\n case ColumnTypeEnum.DATE_LIST:\n return 'Date List'\n case ColumnTypeEnum.USERID_LIST:\n return 'User ID List'\n case ColumnTypeEnum.ENTITYID_LIST:\n return 'Entity ID List'\n case ColumnTypeEnum.EVALUATIONID:\n return 'Evaluation'\n case ColumnTypeEnum.SUBMISSIONID:\n return 'Submission'\n case ColumnTypeEnum.JSON:\n return 'JSON'\n default:\n return type\n }\n}\n\n/**\n * Can the given type have a size?\n *\n * @param type\n * @return\n */\nexport function canHaveSize(type: ColumnType | ColumnTypeEnum): boolean {\n switch (type) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.LINK:\n return true\n default:\n // all others are false\n return false\n }\n}\n\nexport function canHaveMaxListLength(\n type: ColumnType | ColumnTypeEnum,\n): boolean {\n switch (type) {\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.BOOLEAN_LIST:\n case ColumnTypeEnum.DATE_LIST:\n case ColumnTypeEnum.INTEGER_LIST:\n case ColumnTypeEnum.ENTITYID_LIST:\n return true\n default:\n // all others are false\n return false\n }\n}\n\n/**\n * Configure the facet selection based on the column type\n *\n * @param type a ColumnType for which to get the facet selection\n * @param isJsonSubColumnFacet is this a facet for a json subcolumn?\n * @return the allowed facetTypes, or null if faceting is not allowed\n */\nexport function configureFacetsForType(\n type: ColumnType | ColumnTypeEnum,\n isJsonSubColumnFacet: boolean,\n): (FacetType | undefined)[] | null {\n let allowedFacetTypes: (FacetType | undefined)[] | null\n switch (type) {\n case ColumnTypeEnum.INTEGER:\n case ColumnTypeEnum.INTEGER_LIST:\n allowedFacetTypes = ['enumeration', 'range']\n break\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.BOOLEAN:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.BOOLEAN_LIST:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.EVALUATIONID:\n allowedFacetTypes = ['enumeration']\n break\n case ColumnTypeEnum.DOUBLE:\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n allowedFacetTypes = ['range']\n break\n default:\n allowedFacetTypes = null\n }\n\n if (allowedFacetTypes && !isJsonSubColumnFacet) {\n // jsonSubColumn facets MUST have a facet definition, but regular column models do not need one\n // So allow `undefined` for regular columnModels.\n allowedFacetTypes = [undefined, ...allowedFacetTypes]\n }\n return allowedFacetTypes\n}\n\nexport function canHaveDefault(\n type: ColumnType | ColumnTypeEnum,\n isView: boolean,\n isJsonSubColumnFacet: boolean,\n) {\n // SWC-6333: default types are not allowed in views\n if (isView) {\n return false\n } else if (isJsonSubColumnFacet) {\n return false\n } else {\n switch (type) {\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.MEDIUMTEXT:\n case ColumnTypeEnum.LARGETEXT:\n case ColumnTypeEnum.JSON:\n case ColumnTypeEnum.SUBMISSIONID:\n case ColumnTypeEnum.EVALUATIONID:\n return false\n default:\n return true\n }\n }\n}\n\nexport const DEFAULT_STRING_SIZE = 50\nexport const MAX_STRING_SIZE = 1000\nexport const MAX_LIST_LENGTH = 100\n\n/**\n * Get the default max size for a given type.\n *\n * @param type\n * @return\n */\nexport function getMaxSizeForType(type: ColumnType | ColumnTypeEnum): number {\n switch (type) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.LINK:\n return MAX_STRING_SIZE\n default:\n throw new Error(`Type is not known to have a max size: ${type}`)\n }\n}\n\nexport function canHaveRestrictedValues(\n type: ColumnType | ColumnTypeEnum,\n isJsonSubColumnFacet: boolean,\n): boolean {\n if (isJsonSubColumnFacet) {\n return false\n }\n switch (type) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.INTEGER:\n case ColumnTypeEnum.ENTITYID:\n return true\n default:\n // all other are false\n return false\n }\n}\n\nfunction transformEnumValues(\n enumValues: string[],\n columnType: ColumnType | ColumnTypeEnum,\n): (string | number)[] {\n // SWC-6622 - Special case: if these are INTEGER, convert to numbers before inserting data into form components\n // The editor validates that these are integers, so inserting the strings returned by the API causes an\n // unexpected validation error\n if (columnType === ColumnTypeEnum.INTEGER) {\n return enumValues.map(value => parseInt(value))\n }\n return enumValues\n}\n\n/**\n * Transform ColumnModels returned by Synapse into the form data for the TableColumnSchemaForm.\n * Default column models, if available, are used to determine which columns should not be editable in the form.\n * @param columnModels\n * @param defaultColumns\n */\nexport function transformColumnModelsToFormData(\n columnModels: SetOptional<ColumnModel, 'id'>[],\n defaultColumns: ColumnModel[] = [],\n): ColumnModelFormData[] {\n return columnModels.map((cm): ColumnModelFormData => {\n return {\n ...cm,\n columnType: cm.columnType as ColumnTypeEnum,\n maximumSize:\n cm.maximumSize == null ? undefined : cm.maximumSize.toString(),\n maximumListLength:\n cm.maximumListLength == null\n ? undefined\n : cm.maximumListLength.toString(),\n isSelected: false,\n // If the name matches a known default column model, then we consider it to be a default column model itself\n isOriginallyDefaultColumn: defaultColumns.some(\n dcm => dcm.name === cm.name,\n ),\n jsonSubColumns: cm.jsonSubColumns\n ? cm.jsonSubColumns.map(\n (jsc): JsonSubColumnModelFormData => ({\n ...jsc,\n columnType: jsc.columnType as ColumnTypeEnum,\n isSelected: false,\n }),\n )\n : undefined,\n // If this is defaultValue for a LIST column, the value is a serialized string\n defaultValue:\n cm.defaultValue && cm.columnType.endsWith('_LIST')\n ? JSON.parse(cm.defaultValue)\n : cm.defaultValue,\n enumValues:\n cm.enumValues != null\n ? transformEnumValues(cm.enumValues, cm.columnType)\n : undefined,\n }\n })\n}\n\nexport function getViewScopeForEntity(entity: Entity): ViewScope | undefined {\n if (isEntityView(entity)) {\n return {\n scope: entity.scopeIds,\n viewTypeMask: entity.viewTypeMask,\n viewEntityType: convertToEntityType(\n entity.concreteType,\n ) as ViewEntityType,\n }\n } else if (isDataset(entity) || isDatasetCollection(entity)) {\n const mask = isDataset(entity)\n ? ENTITY_VIEW_TYPE_MASK_FILE\n : ENTITY_VIEW_TYPE_MASK_DATASET\n return {\n scope: (entity.items ?? []).map(\n item => `${item.entityId}.${item.versionNumber}`,\n ),\n viewTypeMask: mask,\n viewEntityType: convertToEntityType(\n entity.concreteType,\n ) as ViewEntityType,\n }\n } else if (isSubmissionView(entity)) {\n return {\n scope: entity.scopeIds,\n viewTypeMask: undefined,\n viewEntityType: convertToEntityType(\n entity.concreteType,\n ) as ViewEntityType,\n }\n }\n return undefined\n}\n\nexport function getJsonSchemaItemDefinitionForColumnType(\n columnType: ColumnTypeEnum,\n): JSONSchema7Definition {\n switch (columnType) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n return { type: 'string', minLength: 1 }\n case ColumnTypeEnum.DOUBLE:\n return { type: 'number' }\n case ColumnTypeEnum.BOOLEAN:\n case ColumnTypeEnum.BOOLEAN_LIST:\n return { type: 'boolean' }\n case ColumnTypeEnum.INTEGER:\n case ColumnTypeEnum.INTEGER_LIST:\n return { type: 'integer' }\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n return { type: 'string', format: 'datetime' }\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.LINK:\n case ColumnTypeEnum.MEDIUMTEXT:\n case ColumnTypeEnum.LARGETEXT:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.SUBMISSIONID:\n case ColumnTypeEnum.JSON:\n case ColumnTypeEnum.EVALUATIONID:\n default:\n return { type: 'string', minLength: 1 }\n }\n}\n\nconst columnModelMatchesFormData = (\n model: ColumnModel,\n target: ColumnModelFormData,\n): boolean => {\n return model.name === target.name && model.columnType === target.columnType\n}\n\nexport const findMatchingColumnModel = (\n columnModels: ColumnModel[],\n target: ColumnModelFormData,\n): ColumnModel | undefined => {\n let closestMatch: ColumnModel | undefined\n\n for (const model of columnModels) {\n if (columnModelMatchesFormData(model, target)) {\n closestMatch = model\n break\n }\n }\n\n return closestMatch\n}\n\nexport function getFormDataValueAsNumber(\n formDataValue: string | number | undefined,\n): number | null {\n const maxSize =\n formDataValue !== null ? parseFloat(String(formDataValue)) : null\n const isInteger = Number.isInteger(maxSize)\n return isInteger ? maxSize : null\n}\n\nexport const isFormDataValueSmallerThanRecommendedValue = (\n formDataValue: string | number | undefined,\n recommendedValue: number | undefined,\n): boolean => {\n const currentValue = getFormDataValueAsNumber(formDataValue)\n return recommendedValue != null && currentValue != null && currentValue > 0\n ? currentValue < recommendedValue\n : false\n}\n\nexport function doesColumnModelSatisfyAnnotationMinimums(\n columnModel: ColumnModelFormData,\n annotationColumnModel?: ColumnModel,\n): boolean {\n if (!annotationColumnModel) {\n return true\n }\n\n if (\n isFormDataValueSmallerThanRecommendedValue(\n columnModel.maximumSize,\n annotationColumnModel.maximumSize,\n ) ||\n isFormDataValueSmallerThanRecommendedValue(\n columnModel.maximumListLength,\n annotationColumnModel.maximumListLength,\n )\n ) {\n return false\n }\n\n return true\n}\n\nexport function getNumberOfColumnModelsWithValuesBelowMinimumRecommendedSizes(\n columnModels: ColumnModelFormData[],\n annotationColumnModels: ColumnModel[],\n): number {\n return columnModels.filter(cm => {\n const matchingAnnotationColumnModel = findMatchingColumnModel(\n annotationColumnModels,\n cm,\n )\n\n return !doesColumnModelSatisfyAnnotationMinimums(\n cm,\n matchingAnnotationColumnModel,\n )\n }).length\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableColumnSchemaEditorUtils.js","names":[],"sources":["../../../src/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.ts"],"sourcesContent":["import {\n convertToEntityType,\n isDataset,\n isDatasetCollection,\n isEntityView,\n isSubmissionView,\n} from '@/utils/functions/EntityTypeUtils'\nimport { ViewEntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ColumnModel,\n ColumnType,\n ColumnTypeEnum,\n Entity,\n ENTITY_VIEW_TYPE_MASK_DATASET,\n ENTITY_VIEW_TYPE_MASK_FILE,\n FacetType,\n ViewScope,\n} from '@sage-bionetworks/synapse-types'\nimport { JSONSchema7Definition } from 'json-schema'\nimport { SetOptional } from 'type-fest'\nimport {\n ColumnModelFormData,\n JsonSubColumnModelFormData,\n} from './Validators/ColumnModelValidator'\n\n/**\n * These column types can only be used in Tables. They can not be used in views.\n * See SWC-6333 - for views, only allow column types that are mapped to annotation types.\n */\nconst unsupportedTypesForViews = [ColumnTypeEnum.JSON]\n\n/**\n * Get the allowed column types for a column model based on the table type.\n * @param isView - whether the base table is a view\n * @param isJsonSubColumnFacet - whether the proposed column is a JSON subcolumn facet\n */\nexport function getAllowedColumnTypes(\n isView: boolean,\n isJsonSubColumnFacet: boolean,\n): ColumnTypeEnum[] {\n return Object.values(ColumnTypeEnum)\n .filter(columnType =>\n isView ? !unsupportedTypesForViews.includes(columnType) : true,\n )\n .filter(columnType => {\n if (isJsonSubColumnFacet) {\n switch (columnType) {\n // JSON Subcolumns cannot be JSON or LIST types\n case ColumnTypeEnum.JSON:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.INTEGER_LIST:\n case ColumnTypeEnum.BOOLEAN_LIST:\n case ColumnTypeEnum.DATE_LIST:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.ENTITYID_LIST:\n return false\n default:\n return true\n }\n }\n return true\n })\n}\n\nexport function getFacetTypeFriendlyName(facetType: FacetType) {\n switch (facetType) {\n case 'enumeration':\n return 'Values'\n case 'range':\n return 'Range'\n default:\n return facetType\n }\n}\nexport function getColumnTypeFriendlyName(type: ColumnType | ColumnTypeEnum) {\n switch (type) {\n case ColumnTypeEnum.STRING:\n return 'String'\n case ColumnTypeEnum.DOUBLE:\n return 'Double'\n case ColumnTypeEnum.BOOLEAN:\n return 'Boolean'\n case ColumnTypeEnum.INTEGER:\n return 'Integer'\n case ColumnTypeEnum.DATE:\n return 'Date'\n case ColumnTypeEnum.FILEHANDLEID:\n return 'File'\n case ColumnTypeEnum.ENTITYID:\n return 'Entity'\n case ColumnTypeEnum.LINK:\n return 'Link'\n case ColumnTypeEnum.MEDIUMTEXT:\n return 'MediumText'\n case ColumnTypeEnum.LARGETEXT:\n return 'LargeText'\n case ColumnTypeEnum.USERID:\n return 'User'\n case ColumnTypeEnum.STRING_LIST:\n return 'String List'\n case ColumnTypeEnum.INTEGER_LIST:\n return 'Integer List'\n case ColumnTypeEnum.BOOLEAN_LIST:\n return 'Boolean List'\n case ColumnTypeEnum.DATE_LIST:\n return 'Date List'\n case ColumnTypeEnum.USERID_LIST:\n return 'User ID List'\n case ColumnTypeEnum.ENTITYID_LIST:\n return 'Entity ID List'\n case ColumnTypeEnum.EVALUATIONID:\n return 'Evaluation'\n case ColumnTypeEnum.SUBMISSIONID:\n return 'Submission'\n case ColumnTypeEnum.JSON:\n return 'JSON'\n default:\n return type\n }\n}\n\n/**\n * Can the given type have a size?\n *\n * @param type\n * @return\n */\nexport function canHaveSize(type: ColumnType | ColumnTypeEnum): boolean {\n switch (type) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.LINK:\n return true\n default:\n // all others are false\n return false\n }\n}\n\nexport function canHaveMaxListLength(\n type: ColumnType | ColumnTypeEnum,\n): boolean {\n switch (type) {\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.BOOLEAN_LIST:\n case ColumnTypeEnum.DATE_LIST:\n case ColumnTypeEnum.INTEGER_LIST:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.USERID_LIST:\n return true\n default:\n // all others are false\n return false\n }\n}\n\n/**\n * Configure the facet selection based on the column type\n *\n * @param type a ColumnType for which to get the facet selection\n * @param isJsonSubColumnFacet is this a facet for a json subcolumn?\n * @return the allowed facetTypes, or null if faceting is not allowed\n */\nexport function configureFacetsForType(\n type: ColumnType | ColumnTypeEnum,\n isJsonSubColumnFacet: boolean,\n): (FacetType | undefined)[] | null {\n let allowedFacetTypes: (FacetType | undefined)[] | null\n switch (type) {\n case ColumnTypeEnum.INTEGER:\n case ColumnTypeEnum.INTEGER_LIST:\n allowedFacetTypes = ['enumeration', 'range']\n break\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.BOOLEAN:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.BOOLEAN_LIST:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.EVALUATIONID:\n allowedFacetTypes = ['enumeration']\n break\n case ColumnTypeEnum.DOUBLE:\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n allowedFacetTypes = ['range']\n break\n default:\n allowedFacetTypes = null\n }\n\n if (allowedFacetTypes && !isJsonSubColumnFacet) {\n // jsonSubColumn facets MUST have a facet definition, but regular column models do not need one\n // So allow `undefined` for regular columnModels.\n allowedFacetTypes = [undefined, ...allowedFacetTypes]\n }\n return allowedFacetTypes\n}\n\n/**\n * Column types that are not allowed to have a default value.\n * @see the `defaultValue` property description on the ColumnModel schema in the Synapse OpenAPI specification.\n */\nexport const DISALLOWED_DEFAULT_VALUE_COLUMN_TYPES: ColumnTypeEnum[] = [\n ColumnTypeEnum.ENTITYID,\n ColumnTypeEnum.ENTITYID_LIST,\n ColumnTypeEnum.EVALUATIONID,\n ColumnTypeEnum.FILEHANDLEID,\n ColumnTypeEnum.LARGETEXT,\n ColumnTypeEnum.MEDIUMTEXT,\n ColumnTypeEnum.SUBMISSIONID,\n ColumnTypeEnum.USERID,\n ColumnTypeEnum.USERID_LIST,\n]\n\nexport function canHaveDefault(\n type: ColumnType | ColumnTypeEnum,\n isView: boolean,\n isJsonSubColumnFacet: boolean,\n) {\n // SWC-6333: default types are not allowed in views\n if (isView) {\n return false\n } else if (isJsonSubColumnFacet) {\n return false\n } else {\n return !DISALLOWED_DEFAULT_VALUE_COLUMN_TYPES.includes(\n type as ColumnTypeEnum,\n )\n }\n}\n\nexport const DEFAULT_STRING_SIZE = 50\nexport const MAX_STRING_SIZE = 1000\nexport const DEFAULT_LIST_LENGTH = 100\n\n/** The maximum number of characters allowed in a column name. */\nexport const MAX_COLUMN_NAME_LENGTH = 256\n\n/** The maximum number of enumeration values allowed for a single column. */\nexport const MAX_ENUM_VALUES = 100\n\n/**\n * The maximum total character budget for a list column. The server enforces that\n * `maximumListLength * <per-element character size>` does not exceed this value.\n */\nexport const LIST_LENGTH_CHARACTER_BUDGET = 100_000\n\n/**\n * The fixed per-element character size (in the list-length budget) for list column types\n * whose element size is not configurable. STRING_LIST is excluded because its per-element\n * size is the configurable `maximumSize`.\n */\nconst FIXED_LIST_ELEMENT_CHARACTER_SIZE: Partial<\n Record<ColumnTypeEnum, number>\n> = {\n [ColumnTypeEnum.INTEGER_LIST]: 20,\n [ColumnTypeEnum.DATE_LIST]: 20,\n [ColumnTypeEnum.USERID_LIST]: 20,\n [ColumnTypeEnum.BOOLEAN_LIST]: 5,\n [ColumnTypeEnum.ENTITYID_LIST]: 44,\n}\n\n/**\n * Get the default max size for a given type.\n *\n * @param type\n * @return\n */\nexport function getMaxSizeForType(type: ColumnType | ColumnTypeEnum): number {\n switch (type) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n case ColumnTypeEnum.LINK:\n return MAX_STRING_SIZE\n default:\n throw new Error(`Type is not known to have a max size: ${type}`)\n }\n}\n\n/**\n * Get the maximum allowed `maximumListLength` for a list column type.\n *\n * The server enforces a total character budget of {@link LIST_LENGTH_CHARACTER_BUDGET}.\n * For STRING_LIST the per-element size is the configurable `maximumSize` (defaulting to\n * {@link DEFAULT_STRING_SIZE}); for all other list types the per-element size is fixed.\n *\n * @param type the list column type\n * @param maximumSize the configured element size, used only for STRING_LIST\n * @return the maximum allowed list length\n */\nexport function getMaxListLengthForType(\n type: ColumnType | ColumnTypeEnum,\n maximumSize?: number,\n): number {\n if (type === ColumnTypeEnum.STRING_LIST) {\n const elementSize = maximumSize ?? DEFAULT_STRING_SIZE\n return Math.floor(LIST_LENGTH_CHARACTER_BUDGET / elementSize)\n }\n const elementSize = FIXED_LIST_ELEMENT_CHARACTER_SIZE[type as ColumnTypeEnum]\n if (elementSize == null) {\n throw new Error(`Type is not known to have a max list length: ${type}`)\n }\n return Math.floor(LIST_LENGTH_CHARACTER_BUDGET / elementSize)\n}\n\nexport function canHaveRestrictedValues(\n type: ColumnType | ColumnTypeEnum,\n isJsonSubColumnFacet: boolean,\n): boolean {\n if (isJsonSubColumnFacet) {\n return false\n }\n switch (type) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.INTEGER:\n case ColumnTypeEnum.ENTITYID:\n return true\n default:\n // all other are false\n return false\n }\n}\n\nfunction transformEnumValues(\n enumValues: string[],\n columnType: ColumnType | ColumnTypeEnum,\n): (string | number)[] {\n // SWC-6622 - Special case: if these are INTEGER, convert to numbers before inserting data into form components\n // The editor validates that these are integers, so inserting the strings returned by the API causes an\n // unexpected validation error\n if (columnType === ColumnTypeEnum.INTEGER) {\n return enumValues.map(value => parseInt(value))\n }\n return enumValues\n}\n\n/**\n * Transform ColumnModels returned by Synapse into the form data for the TableColumnSchemaForm.\n * Default column models, if available, are used to determine which columns should not be editable in the form.\n * @param columnModels\n * @param defaultColumns\n */\nexport function transformColumnModelsToFormData(\n columnModels: SetOptional<ColumnModel, 'id'>[],\n defaultColumns: ColumnModel[] = [],\n): ColumnModelFormData[] {\n return columnModels.map((cm): ColumnModelFormData => {\n return {\n ...cm,\n columnType: cm.columnType as ColumnTypeEnum,\n maximumSize:\n cm.maximumSize == null ? undefined : cm.maximumSize.toString(),\n maximumListLength:\n cm.maximumListLength == null\n ? undefined\n : cm.maximumListLength.toString(),\n isSelected: false,\n // If the name matches a known default column model, then we consider it to be a default column model itself\n isOriginallyDefaultColumn: defaultColumns.some(\n dcm => dcm.name === cm.name,\n ),\n jsonSubColumns: cm.jsonSubColumns\n ? cm.jsonSubColumns.map(\n (jsc): JsonSubColumnModelFormData => ({\n ...jsc,\n columnType: jsc.columnType as ColumnTypeEnum,\n isSelected: false,\n }),\n )\n : undefined,\n // If this is defaultValue for a LIST column, the value is a serialized string\n defaultValue:\n cm.defaultValue && cm.columnType.endsWith('_LIST')\n ? JSON.parse(cm.defaultValue)\n : cm.defaultValue,\n enumValues:\n cm.enumValues != null\n ? transformEnumValues(cm.enumValues, cm.columnType)\n : undefined,\n }\n })\n}\n\nexport function getViewScopeForEntity(entity: Entity): ViewScope | undefined {\n if (isEntityView(entity)) {\n return {\n scope: entity.scopeIds,\n viewTypeMask: entity.viewTypeMask,\n viewEntityType: convertToEntityType(\n entity.concreteType,\n ) as ViewEntityType,\n }\n } else if (isDataset(entity) || isDatasetCollection(entity)) {\n const mask = isDataset(entity)\n ? ENTITY_VIEW_TYPE_MASK_FILE\n : ENTITY_VIEW_TYPE_MASK_DATASET\n return {\n scope: (entity.items ?? []).map(\n item => `${item.entityId}.${item.versionNumber}`,\n ),\n viewTypeMask: mask,\n viewEntityType: convertToEntityType(\n entity.concreteType,\n ) as ViewEntityType,\n }\n } else if (isSubmissionView(entity)) {\n return {\n scope: entity.scopeIds,\n viewTypeMask: undefined,\n viewEntityType: convertToEntityType(\n entity.concreteType,\n ) as ViewEntityType,\n }\n }\n return undefined\n}\n\nexport function getJsonSchemaItemDefinitionForColumnType(\n columnType: ColumnTypeEnum,\n): JSONSchema7Definition {\n switch (columnType) {\n case ColumnTypeEnum.STRING:\n case ColumnTypeEnum.STRING_LIST:\n return { type: 'string', minLength: 1 }\n case ColumnTypeEnum.DOUBLE:\n return { type: 'number' }\n case ColumnTypeEnum.BOOLEAN:\n case ColumnTypeEnum.BOOLEAN_LIST:\n return { type: 'boolean' }\n case ColumnTypeEnum.INTEGER:\n case ColumnTypeEnum.INTEGER_LIST:\n return { type: 'integer' }\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n return { type: 'string', format: 'datetime' }\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.ENTITYID:\n case ColumnTypeEnum.ENTITYID_LIST:\n case ColumnTypeEnum.LINK:\n case ColumnTypeEnum.MEDIUMTEXT:\n case ColumnTypeEnum.LARGETEXT:\n case ColumnTypeEnum.USERID:\n case ColumnTypeEnum.USERID_LIST:\n case ColumnTypeEnum.SUBMISSIONID:\n case ColumnTypeEnum.JSON:\n case ColumnTypeEnum.EVALUATIONID:\n default:\n return { type: 'string', minLength: 1 }\n }\n}\n\nconst columnModelMatchesFormData = (\n model: ColumnModel,\n target: ColumnModelFormData,\n): boolean => {\n return model.name === target.name && model.columnType === target.columnType\n}\n\nexport const findMatchingColumnModel = (\n columnModels: ColumnModel[],\n target: ColumnModelFormData,\n): ColumnModel | undefined => {\n let closestMatch: ColumnModel | undefined\n\n for (const model of columnModels) {\n if (columnModelMatchesFormData(model, target)) {\n closestMatch = model\n break\n }\n }\n\n return closestMatch\n}\n\nexport function getFormDataValueAsNumber(\n formDataValue: string | number | undefined,\n): number | null {\n const maxSize =\n formDataValue !== null ? parseFloat(String(formDataValue)) : null\n const isInteger = Number.isInteger(maxSize)\n return isInteger ? maxSize : null\n}\n\nexport const isFormDataValueSmallerThanRecommendedValue = (\n formDataValue: string | number | undefined,\n recommendedValue: number | undefined,\n): boolean => {\n const currentValue = getFormDataValueAsNumber(formDataValue)\n return recommendedValue != null && currentValue != null && currentValue > 0\n ? currentValue < recommendedValue\n : false\n}\n\nexport function doesColumnModelSatisfyAnnotationMinimums(\n columnModel: ColumnModelFormData,\n annotationColumnModel?: ColumnModel,\n): boolean {\n if (!annotationColumnModel) {\n return true\n }\n\n if (\n isFormDataValueSmallerThanRecommendedValue(\n columnModel.maximumSize,\n annotationColumnModel.maximumSize,\n ) ||\n isFormDataValueSmallerThanRecommendedValue(\n columnModel.maximumListLength,\n annotationColumnModel.maximumListLength,\n )\n ) {\n return false\n }\n\n return true\n}\n\nexport function getNumberOfColumnModelsWithValuesBelowMinimumRecommendedSizes(\n columnModels: ColumnModelFormData[],\n annotationColumnModels: ColumnModel[],\n): number {\n return columnModels.filter(cm => {\n const matchingAnnotationColumnModel = findMatchingColumnModel(\n annotationColumnModels,\n cm,\n )\n\n return !doesColumnModelSatisfyAnnotationMinimums(\n cm,\n matchingAnnotationColumnModel,\n )\n }).length\n}\n"],"mappings":"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"}
|
|
@@ -83,7 +83,7 @@ function U(i, s) {
|
|
|
83
83
|
q && $(q);
|
|
84
84
|
}, [q, $]), oe = g(() => {
|
|
85
85
|
X && $(X);
|
|
86
|
-
}, [X, $]), se = v(() => z ? b(z.
|
|
86
|
+
}, [X, $]), se = v(() => z ? b(z.issues, (e) => e.path[0]) : {}, [z]);
|
|
87
87
|
return /* @__PURE__ */ k(w, {
|
|
88
88
|
component: "form",
|
|
89
89
|
sx: { py: 2.5 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableColumnSchemaForm.js","names":[],"sources":["../../../src/components/TableColumnSchemaEditor/TableColumnSchemaForm.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport {\n useGetAnnotationColumnModels,\n useGetDefaultColumnModels,\n} from '@/synapse-queries/table/useColumnModel'\nimport {\n convertToConcreteEntityType,\n entityTypeToFriendlyName,\n} from '@/utils/functions/EntityTypeUtils'\nimport { AddCircleTwoTone } from '@mui/icons-material'\nimport { Box, Button, styled } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ColumnModel,\n ColumnTypeEnum,\n VIEW_CONCRETE_TYPE_VALUES,\n ViewScope,\n} from '@sage-bionetworks/synapse-types'\nimport { atom, Provider, useAtomValue, useSetAtom } from 'jotai'\nimport { selectAtom, useAtomCallback } from 'jotai/utils'\nimport { groupBy, isEqual, noop, omit, times } from 'lodash-es'\nimport pluralize from 'pluralize'\nimport {\n ForwardedRef,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react'\nimport { SetOptional } from 'type-fest'\nimport { ZodError, ZodIssue } from 'zod'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { displayToast } from '../ToastMessage'\nimport ColumnModelForm from './ColumnModelForm'\nimport ImportTableColumnsButton from './ImportTableColumnsButton'\nimport {\n findMatchingColumnModel,\n getAllowedColumnTypes,\n transformColumnModelsToFormData,\n} from './TableColumnSchemaEditorUtils'\nimport { TableColumnSchemaFormActions } from './TableColumnSchemaFormActions'\nimport { tableColumnSchemaFormDataAtom } from './TableColumnSchemaFormReducer'\nimport { validateColumnModelFormData } from './Validators/ColumnModelValidator'\n\nconst COLUMN_SCHEMA_FORM_GRID_TEMPLATE_COLUMNS =\n '18px 18px 1.75fr 1.75fr 0.75fr 1fr 1.25fr 1.25fr 1fr 1.25fr'\nconst GRID_CONTAINER_Y_MARGIN_PX = 6\nexport const HIERARCHY_VERTICAL_LINE_COMPONENT = (\n <Box\n sx={{\n width: '1px',\n height: `calc(100% + 2 * ${GRID_CONTAINER_Y_MARGIN_PX}px)`,\n backgroundColor: 'grey.400',\n marginLeft: '8px',\n }}\n />\n)\nexport const HIERARCHY_END_COMPONENT = (\n <Box\n sx={theme => ({\n width: '50%',\n height: '60%',\n borderLeft: `1px solid ${theme.palette.grey[400]}`,\n borderBottom: `1px solid ${theme.palette.grey[400]}`,\n marginLeft: '8px',\n marginBottom: 'auto',\n marginRight: '0',\n borderBottomLeftRadius: '5px',\n })}\n />\n)\n\nexport type SubmitHandle = {\n // Allow the parent component to trigger a submit of the form, so this may be embedded in an arbitrary modal.\n submit: () => void\n // Imperative handle to get the data out of the form for SWC compatibility\n getEditedColumnModels: () => SetOptional<ColumnModel, 'id'>[]\n // Used to check if all form data is valid. Returns the current validity state\n validate: () => boolean\n}\n\ntype TableColumnSchemaFormProps = {\n /* The type of the Table, which determines various schema restrictions and form functionality */\n entityType: EntityType\n /* If this is an entity view, the ViewScope can be used to determine the default column models and fetch annotation column models */\n viewScope?: ViewScope\n initialData?: SetOptional<ColumnModel, 'id'>[]\n onSubmit?: (newColumnModels: SetOptional<ColumnModel, 'id'>[]) => void\n isSubmitting?: boolean\n /** The original/current column models that are applied to the table, if they exist. */\n originalColumnModels?: ColumnModel[]\n}\n\nconst ColumnHeader = styled(Box, {\n label: 'ColumnHeader',\n})({\n fontWeight: 700,\n})\n\nexport const ADD_ALL_ANNOTATIONS_BUTTON_TEXT = 'Add All Annotations'\n\nfunction TableColumnSchemaFormInternal(\n props: TableColumnSchemaFormProps,\n ref: ForwardedRef<SubmitHandle>,\n) {\n const {\n initialData,\n entityType,\n viewScope,\n onSubmit = noop,\n isSubmitting = false,\n originalColumnModels,\n } = props\n\n const numColumnModels = useAtomValue(\n useMemo(() => atom(get => get(tableColumnSchemaFormDataAtom).length), []),\n )\n\n const dispatch = useSetAtom(tableColumnSchemaFormDataAtom)\n const [validationErrors, setValidationErrors] = useState<ZodError | null>(\n null,\n )\n\n // useAtomCallback will let us imperatively read the form data, instead of tracking it in state and triggering a full re-render of the form when any data changes\n const readFormData = useAtomCallback(\n useCallback(get => {\n return get(tableColumnSchemaFormDataAtom)\n }, []),\n )\n const concreteTableType = convertToConcreteEntityType(entityType)\n const isView = VIEW_CONCRETE_TYPE_VALUES.includes(\n concreteTableType as (typeof VIEW_CONCRETE_TYPE_VALUES)[number],\n )\n const hasAnnotationColumnModels = isView,\n hasDefaultColumnModels = isView\n\n const { data: defaultColumnModels, isLoading: isLoadingDefaultColumns } =\n useGetDefaultColumnModels(\n viewScope?.viewEntityType!,\n viewScope?.viewTypeMask,\n {\n enabled: hasDefaultColumnModels,\n staleTime: Infinity, // The default column models will never change\n },\n )\n\n const annotationColumnModelsQuery = useGetAnnotationColumnModels(\n {\n viewScope: viewScope!,\n includeDerivedAnnotations: true,\n concreteType:\n 'org.sagebionetworks.repo.model.table.ViewColumnModelRequest',\n },\n {\n enabled: hasAnnotationColumnModels,\n },\n )\n\n const {\n data: annotationColumnModels,\n isLoading: isLoadingAnnotationColumns,\n } = annotationColumnModelsQuery\n\n /**\n * Set the initialData in the form state atom on mount, if it exists and we have no data.\n */\n useEffect(() => {\n if (initialData && !isLoadingDefaultColumns) {\n dispatch({\n type: 'setValue',\n value: transformColumnModelsToFormData(\n initialData,\n defaultColumnModels ?? [],\n ),\n })\n }\n // Don't re-run if initial data changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoadingDefaultColumns])\n\n const validateInternal = useCallback(() => {\n const result = validateColumnModelFormData(readFormData())\n if (result.success) {\n setValidationErrors(null)\n } else {\n setValidationErrors(result.error)\n }\n return result\n }, [readFormData])\n\n useImperativeHandle(ref, () => {\n return {\n submit() {\n const result = validateInternal()\n if (result.success) {\n onSubmit(result.data)\n }\n },\n getEditedColumnModels() {\n const result = validateInternal()\n if (!result.success) {\n throw new Error('Column models were not valid')\n }\n return result.data\n },\n validate() {\n const result = validateInternal()\n return result.success\n },\n }\n }, [onSubmit, validateInternal])\n\n // Generic function to add a set of columns to the schema (e.g. default columns, annotation columns)\n const addColumnSet = useCallback(\n (newColumns: SetOptional<ColumnModel, 'id'>[]) => {\n const currentFormData = readFormData()\n let columnsToAdd = newColumns.filter(\n (cm: SetOptional<ColumnModel, 'id'>) => {\n // Don't add columns that cannot be added (for example, Views cannot have JSON columns)\n if (\n !getAllowedColumnTypes(isView, false).includes(\n cm.columnType as ColumnTypeEnum,\n )\n ) {\n return false\n }\n // Only add columns that are not already present\n // Use the name column to match because the ID may vary, e.g. if the facetType was changed\n return !currentFormData.find(fd => fd.name === cm.name)\n },\n )\n // Remove the ID column so TableColumnSchemaUtils.createTableUpdateTransactionRequest recognizes these as new columns\n // createTableUpdateTransactionRequest uses the existing column ID to track column updates in the table, so any new columns should have no ID\n // The user can also modify these columns before submitting them, so the ID may not be accurate when we end up submitting them\n columnsToAdd = columnsToAdd.map(cm => omit(cm, ['id']))\n if (columnsToAdd.length > 0) {\n dispatch({\n type: 'setValue',\n value: [\n ...currentFormData,\n ...transformColumnModelsToFormData(\n columnsToAdd,\n defaultColumnModels,\n ),\n ],\n })\n displayToast(\n `${columnsToAdd.length} ${pluralize(\n 'column',\n columnsToAdd.length,\n )} added to schema.`,\n 'success',\n )\n } else {\n displayToast(\n 'No columns added. All columns to add are present in the column schema.',\n 'info',\n )\n }\n },\n [defaultColumnModels, dispatch, isView, readFormData],\n )\n\n const addDefaultColumns = useCallback(() => {\n if (defaultColumnModels) {\n addColumnSet(defaultColumnModels)\n }\n }, [defaultColumnModels, addColumnSet])\n\n const addAnnotationColumns = useCallback(() => {\n if (annotationColumnModels) {\n addColumnSet(annotationColumnModels)\n }\n }, [annotationColumnModels, addColumnSet])\n\n // Put the errors into a map of columnModelIndex -> errors\n const errorsByColumnModel = useMemo(() => {\n if (validationErrors) {\n return groupBy(validationErrors.errors, e => e.path[0])\n }\n return {}\n }, [validationErrors])\n\n return (\n <Box\n component={'form'}\n sx={{\n py: 2.5,\n }}\n >\n <TableColumnSchemaFormActions\n disabled={isSubmitting}\n annotationColumnModelsQuery={annotationColumnModelsQuery}\n />\n <Box\n sx={{\n display: 'grid',\n gap: '8px',\n gridTemplateColumns: COLUMN_SCHEMA_FORM_GRID_TEMPLATE_COLUMNS,\n py: 2.5,\n }}\n >\n <ColumnHeader>{/* Checkbox */}</ColumnHeader>\n <ColumnHeader sx={{ gridColumn: '2 / span 2' }}>\n Column Name\n </ColumnHeader>\n <ColumnHeader>Column Type</ColumnHeader>\n <ColumnHeader>Size</ColumnHeader>\n <ColumnHeader>Max List Length</ColumnHeader>\n <ColumnHeader>Default Value</ColumnHeader>\n <ColumnHeader>Restrict Values</ColumnHeader>\n <ColumnHeader>Facet</ColumnHeader>\n <ColumnHeader>Sort Facet Values</ColumnHeader>\n <Box\n sx={{\n gridColumn: '1 / span 11',\n backgroundColor: 'grey.300',\n height: '2px',\n }}\n />\n {times(numColumnModels, index => {\n return (\n <TableColumnSchemaFormRow\n entityType={entityType}\n columnModelIndex={index}\n disabled={isSubmitting}\n key={index}\n columnModelValidationErrors={errorsByColumnModel[index]}\n annotationColumnModels={annotationColumnModels}\n originalColumnModels={originalColumnModels}\n />\n )\n })}\n </Box>\n <Box\n sx={{\n display: 'flex',\n gap: 1,\n }}\n >\n <Button\n variant={'outlined'}\n onClick={() => {\n dispatch({ type: 'appendColumn' })\n }}\n startIcon={<AddCircleTwoTone />}\n disabled={isSubmitting}\n >\n Add Column\n </Button>\n\n {hasDefaultColumnModels && (\n <Button\n variant={'outlined'}\n startIcon={\n isLoadingDefaultColumns ? (\n <SynapseSpinner />\n ) : (\n <AddCircleTwoTone />\n )\n }\n onClick={() => {\n addDefaultColumns()\n }}\n disabled={isLoadingDefaultColumns || isSubmitting}\n >\n Add Default {entityTypeToFriendlyName(entityType)} Columns\n </Button>\n )}\n\n {hasAnnotationColumnModels && (\n <Button\n variant={'outlined'}\n startIcon={\n isLoadingAnnotationColumns ? (\n <SynapseSpinner />\n ) : (\n <AddCircleTwoTone />\n )\n }\n disabled={isLoadingAnnotationColumns || isSubmitting}\n onClick={() => {\n addAnnotationColumns()\n }}\n >\n {ADD_ALL_ANNOTATIONS_BUTTON_TEXT}\n </Button>\n )}\n <ImportTableColumnsButton\n onAddColumns={cms => {\n addColumnSet(cms)\n }}\n disabled={isSubmitting}\n />\n </Box>\n </Box>\n )\n}\n\ntype TableColumnSchemaFormRowProps = {\n entityType: EntityType\n columnModelIndex: number\n disabled: boolean\n columnModelValidationErrors: ZodIssue[] | null\n annotationColumnModels?: ColumnModel[]\n originalColumnModels?: ColumnModel[]\n}\n\nfunction TableColumnSchemaFormRow(props: TableColumnSchemaFormRowProps) {\n const {\n columnModelIndex,\n entityType,\n disabled,\n columnModelValidationErrors = null,\n annotationColumnModels,\n originalColumnModels,\n } = props\n const dispatch = useSetAtom(tableColumnSchemaFormDataAtom)\n const columnModel = useAtomValue(\n useMemo(\n () =>\n selectAtom(\n tableColumnSchemaFormDataAtom,\n formData => formData[columnModelIndex],\n isEqual,\n ),\n [columnModelIndex],\n ),\n )\n\n // Find the original column model that matches the current column model by name and type, so we can tell the user what fields have changed\n const originalColumnModel = originalColumnModels\n ? findMatchingColumnModel(originalColumnModels, columnModel)\n : undefined\n\n // Find the closest match between passed column model and current column model with name and type\n const defaultAnnotationModel = annotationColumnModels\n ? findMatchingColumnModel(annotationColumnModels, columnModel)\n : undefined\n\n // Organize the JSON Subcolumn errors into a map of subcolumn index to errors\n const errorsForSubcolumns = useMemo(() => {\n if (columnModelValidationErrors) {\n const errorsForAllSubcolumns = columnModelValidationErrors.filter(e => {\n return e.path[0] === columnModelIndex && e.path[1] == 'jsonSubColumns'\n })\n return groupBy(errorsForAllSubcolumns, e => e.path[2])\n }\n return {}\n }, [columnModelIndex, columnModelValidationErrors])\n\n if (!columnModel) {\n return <></>\n }\n const isDefaultColumn = columnModel.isOriginallyDefaultColumn\n\n return (\n <>\n <ColumnModelForm\n entityType={entityType}\n columnModelIndex={columnModelIndex}\n isDefaultColumn={isDefaultColumn}\n disabled={disabled}\n validationErrors={columnModelValidationErrors}\n defaultAnnotationModel={defaultAnnotationModel}\n originalColumnModel={originalColumnModel}\n />\n {columnModel.columnType === ColumnTypeEnum.JSON &&\n columnModel.jsonSubColumns &&\n columnModel.jsonSubColumns.map((subColumnFacet, index) => (\n <ColumnModelForm\n key={index}\n entityType={entityType}\n columnModelIndex={columnModelIndex}\n jsonSubColumnIndex={index}\n isDefaultColumn={isDefaultColumn}\n disabled={disabled}\n validationErrors={errorsForSubcolumns[index]}\n />\n ))}\n {columnModel.columnType === ColumnTypeEnum.JSON && (\n <>\n <Box\n sx={{\n gridColumn: '1 / span 2',\n }}\n >\n {HIERARCHY_END_COMPONENT}\n </Box>\n <Box\n sx={{\n gridColumn: '3 / span 5',\n }}\n >\n <Button\n startIcon={<AddToList />}\n variant={'text'}\n disabled={disabled}\n onClick={() =>\n dispatch({ type: 'appendJsonSubColumn', columnModelIndex })\n }\n >\n Add sub-column\n </Button>\n </Box>\n </>\n )}\n </>\n )\n}\n\nconst TableColumnSchemaFormInternalWithForwardRef = forwardRef<\n SubmitHandle,\n TableColumnSchemaFormProps\n>(TableColumnSchemaFormInternal)\n\nconst TableColumnSchemaFormWrapped = forwardRef<\n SubmitHandle,\n TableColumnSchemaFormProps\n>(function TableColumnSchemaForm(props: TableColumnSchemaFormProps, ref) {\n // Wrap the form in a Jotai provider so that the internal atoms are scoped to just this component instance\n // Use forwardRef to ensure that the ref can be passed along\n return (\n <Provider>\n <TableColumnSchemaFormInternalWithForwardRef {...props} ref={ref} />\n </Provider>\n )\n})\n\nexport default TableColumnSchemaFormWrapped\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableColumnSchemaForm.js","names":[],"sources":["../../../src/components/TableColumnSchemaEditor/TableColumnSchemaForm.tsx"],"sourcesContent":["import AddToList from '@/assets/icons/AddToList'\nimport {\n useGetAnnotationColumnModels,\n useGetDefaultColumnModels,\n} from '@/synapse-queries/table/useColumnModel'\nimport {\n convertToConcreteEntityType,\n entityTypeToFriendlyName,\n} from '@/utils/functions/EntityTypeUtils'\nimport { AddCircleTwoTone } from '@mui/icons-material'\nimport { Box, Button, styled } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n ColumnModel,\n ColumnTypeEnum,\n VIEW_CONCRETE_TYPE_VALUES,\n ViewScope,\n} from '@sage-bionetworks/synapse-types'\nimport { atom, Provider, useAtomValue, useSetAtom } from 'jotai'\nimport { selectAtom, useAtomCallback } from 'jotai/utils'\nimport { groupBy, isEqual, noop, omit, times } from 'lodash-es'\nimport pluralize from 'pluralize'\nimport {\n ForwardedRef,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react'\nimport { SetOptional } from 'type-fest'\nimport { ZodError, ZodIssue } from 'zod'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport { displayToast } from '../ToastMessage'\nimport ColumnModelForm from './ColumnModelForm'\nimport ImportTableColumnsButton from './ImportTableColumnsButton'\nimport {\n findMatchingColumnModel,\n getAllowedColumnTypes,\n transformColumnModelsToFormData,\n} from './TableColumnSchemaEditorUtils'\nimport { TableColumnSchemaFormActions } from './TableColumnSchemaFormActions'\nimport { tableColumnSchemaFormDataAtom } from './TableColumnSchemaFormReducer'\nimport { validateColumnModelFormData } from './Validators/ColumnModelValidator'\n\nconst COLUMN_SCHEMA_FORM_GRID_TEMPLATE_COLUMNS =\n '18px 18px 1.75fr 1.75fr 0.75fr 1fr 1.25fr 1.25fr 1fr 1.25fr'\nconst GRID_CONTAINER_Y_MARGIN_PX = 6\nexport const HIERARCHY_VERTICAL_LINE_COMPONENT = (\n <Box\n sx={{\n width: '1px',\n height: `calc(100% + 2 * ${GRID_CONTAINER_Y_MARGIN_PX}px)`,\n backgroundColor: 'grey.400',\n marginLeft: '8px',\n }}\n />\n)\nexport const HIERARCHY_END_COMPONENT = (\n <Box\n sx={theme => ({\n width: '50%',\n height: '60%',\n borderLeft: `1px solid ${theme.palette.grey[400]}`,\n borderBottom: `1px solid ${theme.palette.grey[400]}`,\n marginLeft: '8px',\n marginBottom: 'auto',\n marginRight: '0',\n borderBottomLeftRadius: '5px',\n })}\n />\n)\n\nexport type SubmitHandle = {\n // Allow the parent component to trigger a submit of the form, so this may be embedded in an arbitrary modal.\n submit: () => void\n // Imperative handle to get the data out of the form for SWC compatibility\n getEditedColumnModels: () => SetOptional<ColumnModel, 'id'>[]\n // Used to check if all form data is valid. Returns the current validity state\n validate: () => boolean\n}\n\ntype TableColumnSchemaFormProps = {\n /* The type of the Table, which determines various schema restrictions and form functionality */\n entityType: EntityType\n /* If this is an entity view, the ViewScope can be used to determine the default column models and fetch annotation column models */\n viewScope?: ViewScope\n initialData?: SetOptional<ColumnModel, 'id'>[]\n onSubmit?: (newColumnModels: SetOptional<ColumnModel, 'id'>[]) => void\n isSubmitting?: boolean\n /** The original/current column models that are applied to the table, if they exist. */\n originalColumnModels?: ColumnModel[]\n}\n\nconst ColumnHeader = styled(Box, {\n label: 'ColumnHeader',\n})({\n fontWeight: 700,\n})\n\nexport const ADD_ALL_ANNOTATIONS_BUTTON_TEXT = 'Add All Annotations'\n\nfunction TableColumnSchemaFormInternal(\n props: TableColumnSchemaFormProps,\n ref: ForwardedRef<SubmitHandle>,\n) {\n const {\n initialData,\n entityType,\n viewScope,\n onSubmit = noop,\n isSubmitting = false,\n originalColumnModels,\n } = props\n\n const numColumnModels = useAtomValue(\n useMemo(() => atom(get => get(tableColumnSchemaFormDataAtom).length), []),\n )\n\n const dispatch = useSetAtom(tableColumnSchemaFormDataAtom)\n const [validationErrors, setValidationErrors] = useState<ZodError | null>(\n null,\n )\n\n // useAtomCallback will let us imperatively read the form data, instead of tracking it in state and triggering a full re-render of the form when any data changes\n const readFormData = useAtomCallback(\n useCallback(get => {\n return get(tableColumnSchemaFormDataAtom)\n }, []),\n )\n const concreteTableType = convertToConcreteEntityType(entityType)\n const isView = VIEW_CONCRETE_TYPE_VALUES.includes(\n concreteTableType as (typeof VIEW_CONCRETE_TYPE_VALUES)[number],\n )\n const hasAnnotationColumnModels = isView,\n hasDefaultColumnModels = isView\n\n const { data: defaultColumnModels, isLoading: isLoadingDefaultColumns } =\n useGetDefaultColumnModels(\n viewScope?.viewEntityType!,\n viewScope?.viewTypeMask,\n {\n enabled: hasDefaultColumnModels,\n staleTime: Infinity, // The default column models will never change\n },\n )\n\n const annotationColumnModelsQuery = useGetAnnotationColumnModels(\n {\n viewScope: viewScope!,\n includeDerivedAnnotations: true,\n concreteType:\n 'org.sagebionetworks.repo.model.table.ViewColumnModelRequest',\n },\n {\n enabled: hasAnnotationColumnModels,\n },\n )\n\n const {\n data: annotationColumnModels,\n isLoading: isLoadingAnnotationColumns,\n } = annotationColumnModelsQuery\n\n /**\n * Set the initialData in the form state atom on mount, if it exists and we have no data.\n */\n useEffect(() => {\n if (initialData && !isLoadingDefaultColumns) {\n dispatch({\n type: 'setValue',\n value: transformColumnModelsToFormData(\n initialData,\n defaultColumnModels ?? [],\n ),\n })\n }\n // Don't re-run if initial data changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoadingDefaultColumns])\n\n const validateInternal = useCallback(() => {\n const result = validateColumnModelFormData(readFormData())\n if (result.success) {\n setValidationErrors(null)\n } else {\n setValidationErrors(result.error)\n }\n return result\n }, [readFormData])\n\n useImperativeHandle(ref, () => {\n return {\n submit() {\n const result = validateInternal()\n if (result.success) {\n onSubmit(result.data)\n }\n },\n getEditedColumnModels() {\n const result = validateInternal()\n if (!result.success) {\n throw new Error('Column models were not valid')\n }\n return result.data\n },\n validate() {\n const result = validateInternal()\n return result.success\n },\n }\n }, [onSubmit, validateInternal])\n\n // Generic function to add a set of columns to the schema (e.g. default columns, annotation columns)\n const addColumnSet = useCallback(\n (newColumns: SetOptional<ColumnModel, 'id'>[]) => {\n const currentFormData = readFormData()\n let columnsToAdd = newColumns.filter(\n (cm: SetOptional<ColumnModel, 'id'>) => {\n // Don't add columns that cannot be added (for example, Views cannot have JSON columns)\n if (\n !getAllowedColumnTypes(isView, false).includes(\n cm.columnType as ColumnTypeEnum,\n )\n ) {\n return false\n }\n // Only add columns that are not already present\n // Use the name column to match because the ID may vary, e.g. if the facetType was changed\n return !currentFormData.find(fd => fd.name === cm.name)\n },\n )\n // Remove the ID column so TableColumnSchemaUtils.createTableUpdateTransactionRequest recognizes these as new columns\n // createTableUpdateTransactionRequest uses the existing column ID to track column updates in the table, so any new columns should have no ID\n // The user can also modify these columns before submitting them, so the ID may not be accurate when we end up submitting them\n columnsToAdd = columnsToAdd.map(cm => omit(cm, ['id']))\n if (columnsToAdd.length > 0) {\n dispatch({\n type: 'setValue',\n value: [\n ...currentFormData,\n ...transformColumnModelsToFormData(\n columnsToAdd,\n defaultColumnModels,\n ),\n ],\n })\n displayToast(\n `${columnsToAdd.length} ${pluralize(\n 'column',\n columnsToAdd.length,\n )} added to schema.`,\n 'success',\n )\n } else {\n displayToast(\n 'No columns added. All columns to add are present in the column schema.',\n 'info',\n )\n }\n },\n [defaultColumnModels, dispatch, isView, readFormData],\n )\n\n const addDefaultColumns = useCallback(() => {\n if (defaultColumnModels) {\n addColumnSet(defaultColumnModels)\n }\n }, [defaultColumnModels, addColumnSet])\n\n const addAnnotationColumns = useCallback(() => {\n if (annotationColumnModels) {\n addColumnSet(annotationColumnModels)\n }\n }, [annotationColumnModels, addColumnSet])\n\n // Put the errors into a map of columnModelIndex -> errors\n const errorsByColumnModel = useMemo(() => {\n if (validationErrors) {\n return groupBy(validationErrors.issues, e => e.path[0])\n }\n return {}\n }, [validationErrors])\n\n return (\n <Box\n component={'form'}\n sx={{\n py: 2.5,\n }}\n >\n <TableColumnSchemaFormActions\n disabled={isSubmitting}\n annotationColumnModelsQuery={annotationColumnModelsQuery}\n />\n <Box\n sx={{\n display: 'grid',\n gap: '8px',\n gridTemplateColumns: COLUMN_SCHEMA_FORM_GRID_TEMPLATE_COLUMNS,\n py: 2.5,\n }}\n >\n <ColumnHeader>{/* Checkbox */}</ColumnHeader>\n <ColumnHeader sx={{ gridColumn: '2 / span 2' }}>\n Column Name\n </ColumnHeader>\n <ColumnHeader>Column Type</ColumnHeader>\n <ColumnHeader>Size</ColumnHeader>\n <ColumnHeader>Max List Length</ColumnHeader>\n <ColumnHeader>Default Value</ColumnHeader>\n <ColumnHeader>Restrict Values</ColumnHeader>\n <ColumnHeader>Facet</ColumnHeader>\n <ColumnHeader>Sort Facet Values</ColumnHeader>\n <Box\n sx={{\n gridColumn: '1 / span 11',\n backgroundColor: 'grey.300',\n height: '2px',\n }}\n />\n {times(numColumnModels, index => {\n return (\n <TableColumnSchemaFormRow\n entityType={entityType}\n columnModelIndex={index}\n disabled={isSubmitting}\n key={index}\n columnModelValidationErrors={errorsByColumnModel[index]}\n annotationColumnModels={annotationColumnModels}\n originalColumnModels={originalColumnModels}\n />\n )\n })}\n </Box>\n <Box\n sx={{\n display: 'flex',\n gap: 1,\n }}\n >\n <Button\n variant={'outlined'}\n onClick={() => {\n dispatch({ type: 'appendColumn' })\n }}\n startIcon={<AddCircleTwoTone />}\n disabled={isSubmitting}\n >\n Add Column\n </Button>\n\n {hasDefaultColumnModels && (\n <Button\n variant={'outlined'}\n startIcon={\n isLoadingDefaultColumns ? (\n <SynapseSpinner />\n ) : (\n <AddCircleTwoTone />\n )\n }\n onClick={() => {\n addDefaultColumns()\n }}\n disabled={isLoadingDefaultColumns || isSubmitting}\n >\n Add Default {entityTypeToFriendlyName(entityType)} Columns\n </Button>\n )}\n\n {hasAnnotationColumnModels && (\n <Button\n variant={'outlined'}\n startIcon={\n isLoadingAnnotationColumns ? (\n <SynapseSpinner />\n ) : (\n <AddCircleTwoTone />\n )\n }\n disabled={isLoadingAnnotationColumns || isSubmitting}\n onClick={() => {\n addAnnotationColumns()\n }}\n >\n {ADD_ALL_ANNOTATIONS_BUTTON_TEXT}\n </Button>\n )}\n <ImportTableColumnsButton\n onAddColumns={cms => {\n addColumnSet(cms)\n }}\n disabled={isSubmitting}\n />\n </Box>\n </Box>\n )\n}\n\ntype TableColumnSchemaFormRowProps = {\n entityType: EntityType\n columnModelIndex: number\n disabled: boolean\n columnModelValidationErrors: ZodIssue[] | null\n annotationColumnModels?: ColumnModel[]\n originalColumnModels?: ColumnModel[]\n}\n\nfunction TableColumnSchemaFormRow(props: TableColumnSchemaFormRowProps) {\n const {\n columnModelIndex,\n entityType,\n disabled,\n columnModelValidationErrors = null,\n annotationColumnModels,\n originalColumnModels,\n } = props\n const dispatch = useSetAtom(tableColumnSchemaFormDataAtom)\n const columnModel = useAtomValue(\n useMemo(\n () =>\n selectAtom(\n tableColumnSchemaFormDataAtom,\n formData => formData[columnModelIndex],\n isEqual,\n ),\n [columnModelIndex],\n ),\n )\n\n // Find the original column model that matches the current column model by name and type, so we can tell the user what fields have changed\n const originalColumnModel = originalColumnModels\n ? findMatchingColumnModel(originalColumnModels, columnModel)\n : undefined\n\n // Find the closest match between passed column model and current column model with name and type\n const defaultAnnotationModel = annotationColumnModels\n ? findMatchingColumnModel(annotationColumnModels, columnModel)\n : undefined\n\n // Organize the JSON Subcolumn errors into a map of subcolumn index to errors\n const errorsForSubcolumns = useMemo(() => {\n if (columnModelValidationErrors) {\n const errorsForAllSubcolumns = columnModelValidationErrors.filter(e => {\n return e.path[0] === columnModelIndex && e.path[1] == 'jsonSubColumns'\n })\n return groupBy(errorsForAllSubcolumns, e => e.path[2])\n }\n return {}\n }, [columnModelIndex, columnModelValidationErrors])\n\n if (!columnModel) {\n return <></>\n }\n const isDefaultColumn = columnModel.isOriginallyDefaultColumn\n\n return (\n <>\n <ColumnModelForm\n entityType={entityType}\n columnModelIndex={columnModelIndex}\n isDefaultColumn={isDefaultColumn}\n disabled={disabled}\n validationErrors={columnModelValidationErrors}\n defaultAnnotationModel={defaultAnnotationModel}\n originalColumnModel={originalColumnModel}\n />\n {columnModel.columnType === ColumnTypeEnum.JSON &&\n columnModel.jsonSubColumns &&\n columnModel.jsonSubColumns.map((subColumnFacet, index) => (\n <ColumnModelForm\n key={index}\n entityType={entityType}\n columnModelIndex={columnModelIndex}\n jsonSubColumnIndex={index}\n isDefaultColumn={isDefaultColumn}\n disabled={disabled}\n validationErrors={errorsForSubcolumns[index]}\n />\n ))}\n {columnModel.columnType === ColumnTypeEnum.JSON && (\n <>\n <Box\n sx={{\n gridColumn: '1 / span 2',\n }}\n >\n {HIERARCHY_END_COMPONENT}\n </Box>\n <Box\n sx={{\n gridColumn: '3 / span 5',\n }}\n >\n <Button\n startIcon={<AddToList />}\n variant={'text'}\n disabled={disabled}\n onClick={() =>\n dispatch({ type: 'appendJsonSubColumn', columnModelIndex })\n }\n >\n Add sub-column\n </Button>\n </Box>\n </>\n )}\n </>\n )\n}\n\nconst TableColumnSchemaFormInternalWithForwardRef = forwardRef<\n SubmitHandle,\n TableColumnSchemaFormProps\n>(TableColumnSchemaFormInternal)\n\nconst TableColumnSchemaFormWrapped = forwardRef<\n SubmitHandle,\n TableColumnSchemaFormProps\n>(function TableColumnSchemaForm(props: TableColumnSchemaFormProps, ref) {\n // Wrap the form in a Jotai provider so that the internal atoms are scoped to just this component instance\n // Use forwardRef to ensure that the ref can be passed along\n return (\n <Provider>\n <TableColumnSchemaFormInternalWithForwardRef {...props} ref={ref} />\n </Provider>\n )\n})\n\nexport default TableColumnSchemaFormWrapped\n"],"mappings":"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"}
|
|
@@ -53,46 +53,46 @@ export declare function reducer(prevState: ColumnModelFormData[], action: TableC
|
|
|
53
53
|
columnType: ColumnTypeEnum;
|
|
54
54
|
isSelected: boolean;
|
|
55
55
|
isOriginallyDefaultColumn: boolean;
|
|
56
|
-
defaultValue?: string | any[] | undefined;
|
|
57
56
|
id?: string | undefined;
|
|
57
|
+
defaultValue?: string | any[] | undefined;
|
|
58
58
|
maximumSize?: string | number | undefined;
|
|
59
59
|
maximumListLength?: string | number | undefined;
|
|
60
60
|
enumValues?: (string | number)[] | undefined;
|
|
61
61
|
facetType?: "range" | "enumeration" | undefined;
|
|
62
|
+
facetSortConfig?: {
|
|
63
|
+
property?: "FREQUENCY" | "VALUE" | undefined;
|
|
64
|
+
direction?: "ASC" | "DESC" | undefined;
|
|
65
|
+
} | undefined;
|
|
62
66
|
jsonSubColumns?: {
|
|
63
67
|
name: string;
|
|
64
68
|
columnType: ColumnTypeEnum;
|
|
65
|
-
facetType: "range" | "enumeration";
|
|
66
69
|
jsonPath: string;
|
|
70
|
+
facetType: "range" | "enumeration";
|
|
67
71
|
isSelected: boolean;
|
|
68
72
|
}[] | undefined;
|
|
69
|
-
facetSortConfig?: {
|
|
70
|
-
direction?: "ASC" | "DESC" | undefined;
|
|
71
|
-
property?: "FREQUENCY" | "VALUE" | undefined;
|
|
72
|
-
} | undefined;
|
|
73
73
|
}[];
|
|
74
74
|
export declare const tableColumnSchemaFormDataAtom: import("jotai").WritableAtom<{
|
|
75
75
|
name: string;
|
|
76
76
|
columnType: ColumnTypeEnum;
|
|
77
77
|
isSelected: boolean;
|
|
78
78
|
isOriginallyDefaultColumn: boolean;
|
|
79
|
-
defaultValue?: string | any[] | undefined;
|
|
80
79
|
id?: string | undefined;
|
|
80
|
+
defaultValue?: string | any[] | undefined;
|
|
81
81
|
maximumSize?: string | number | undefined;
|
|
82
82
|
maximumListLength?: string | number | undefined;
|
|
83
83
|
enumValues?: (string | number)[] | undefined;
|
|
84
84
|
facetType?: "range" | "enumeration" | undefined;
|
|
85
|
+
facetSortConfig?: {
|
|
86
|
+
property?: "FREQUENCY" | "VALUE" | undefined;
|
|
87
|
+
direction?: "ASC" | "DESC" | undefined;
|
|
88
|
+
} | undefined;
|
|
85
89
|
jsonSubColumns?: {
|
|
86
90
|
name: string;
|
|
87
91
|
columnType: ColumnTypeEnum;
|
|
88
|
-
facetType: "range" | "enumeration";
|
|
89
92
|
jsonPath: string;
|
|
93
|
+
facetType: "range" | "enumeration";
|
|
90
94
|
isSelected: boolean;
|
|
91
95
|
}[] | undefined;
|
|
92
|
-
facetSortConfig?: {
|
|
93
|
-
direction?: "ASC" | "DESC" | undefined;
|
|
94
|
-
property?: "FREQUENCY" | "VALUE" | undefined;
|
|
95
|
-
} | undefined;
|
|
96
96
|
}[], [TableColumnSchemaFormReducerAction], void>;
|
|
97
97
|
export {};
|
|
98
98
|
//# sourceMappingURL=TableColumnSchemaFormReducer.d.ts.map
|
|
@@ -2,5 +2,8 @@ import { z } from 'zod';
|
|
|
2
2
|
/**
|
|
3
3
|
* Validates and converts a value to a valid Synapse BOOLEAN value
|
|
4
4
|
*/
|
|
5
|
-
export declare const booleanSchema: z.ZodUnion<[z.
|
|
5
|
+
export declare const booleanSchema: z.ZodUnion<readonly [z.ZodPipe<z.ZodEnum<{
|
|
6
|
+
false: "false";
|
|
7
|
+
true: "true";
|
|
8
|
+
}>, z.ZodTransform<boolean, "false" | "true">>, z.ZodBoolean]>;
|
|
6
9
|
//# sourceMappingURL=BooleanSchema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BooleanSchema.d.ts","sourceRoot":"","sources":["../../../../src/components/TableColumnSchemaEditor/Validators/BooleanSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;GAEG;AACH,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"BooleanSchema.d.ts","sourceRoot":"","sources":["../../../../src/components/TableColumnSchemaEditor/Validators/BooleanSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;GAEG;AACH,eAAO,MAAM,aAAa;;;8DAA0C,CAAA"}
|