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
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { useEstablishWebsocketConnection as e } from "../../synapse-queries/grid/useEstablishWebsocketConnection.js";
|
|
2
2
|
import { useCRDTModelView as t } from "./useCRDTModelView.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { normalizeWebsocketError as n } from "./utils/normalizeWebsocketError.js";
|
|
4
|
+
import { useCallback as r, useEffect as i, useMemo as a, useReducer as o, useRef as s } from "react";
|
|
5
|
+
import { useDocumentVisibility as c } from "@react-hookz/web";
|
|
5
6
|
//#region src/components/DataGrid/useDataGridWebsocket.ts
|
|
6
|
-
function
|
|
7
|
+
function l(e, t) {
|
|
7
8
|
switch (t.type) {
|
|
8
9
|
case "CONNECT_REQUESTED": {
|
|
9
10
|
let n = e.connectionParams && e.connectionParams.replicaId === t.payload.replicaId && e.connectionParams.sessionId === t.payload.sessionId;
|
|
@@ -66,7 +67,7 @@ function c(e, t) {
|
|
|
66
67
|
default: return e;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
|
-
var
|
|
70
|
+
var u = {
|
|
70
71
|
model: null,
|
|
71
72
|
hasCompletedInitialSync: !1,
|
|
72
73
|
isSyncing: !1,
|
|
@@ -78,35 +79,35 @@ var l = {
|
|
|
78
79
|
connectionError: null,
|
|
79
80
|
websocketError: null
|
|
80
81
|
};
|
|
81
|
-
function
|
|
82
|
-
let [
|
|
83
|
-
|
|
82
|
+
function d(d) {
|
|
83
|
+
let [f, p] = o(l, u), m = s(0), h = s(null), g = t(f.model), _ = c(), { mutateAsync: v, isPending: y, error: b, presignedUrl: x, reset: S, clearPresignedUrl: C } = e(), w = r((e) => {
|
|
84
|
+
p({
|
|
84
85
|
type: "MODEL_CREATED",
|
|
85
86
|
payload: e
|
|
86
87
|
});
|
|
87
|
-
}, [
|
|
88
|
+
}, [p]), T = a(() => ({
|
|
88
89
|
onGridReady: () => {
|
|
89
|
-
|
|
90
|
+
p({ type: "GRID_READY" }), d?.onGridReady?.();
|
|
90
91
|
},
|
|
91
|
-
onStatusChange: (e) =>
|
|
92
|
-
onModelCreate:
|
|
93
|
-
onReplicaConnected:
|
|
94
|
-
onReplicaDisconnected:
|
|
95
|
-
onSyncStart: () =>
|
|
96
|
-
onSyncEnd: () =>
|
|
97
|
-
onError: (e) =>
|
|
92
|
+
onStatusChange: (e) => p({ type: e ? "CONNECTION_OPENED" : "CONNECTION_CLOSED" }),
|
|
93
|
+
onModelCreate: w,
|
|
94
|
+
onReplicaConnected: d?.onReplicaConnected,
|
|
95
|
+
onReplicaDisconnected: d?.onReplicaDisconnected,
|
|
96
|
+
onSyncStart: () => p({ type: "SYNC_STARTED" }),
|
|
97
|
+
onSyncEnd: () => p({ type: "SYNC_ENDED" }),
|
|
98
|
+
onError: (e) => p({
|
|
98
99
|
type: "WEBSOCKET_ERROR",
|
|
99
|
-
payload: e
|
|
100
|
+
payload: n(e)
|
|
100
101
|
})
|
|
101
102
|
}), [
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
]),
|
|
107
|
-
|
|
108
|
-
let n =
|
|
109
|
-
|
|
103
|
+
w,
|
|
104
|
+
d?.onGridReady,
|
|
105
|
+
d?.onReplicaConnected,
|
|
106
|
+
d?.onReplicaDisconnected
|
|
107
|
+
]), E = r((e, t) => {
|
|
108
|
+
S(), (!f.connectionParams || f.connectionParams.replicaId !== e || f.connectionParams.sessionId !== t) && C(), m.current += 1;
|
|
109
|
+
let n = m.current;
|
|
110
|
+
p({
|
|
110
111
|
type: "CONNECT_REQUESTED",
|
|
111
112
|
payload: {
|
|
112
113
|
replicaId: e,
|
|
@@ -115,75 +116,75 @@ function u(u) {
|
|
|
115
116
|
}
|
|
116
117
|
});
|
|
117
118
|
}, [
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
x,
|
|
119
|
+
p,
|
|
120
|
+
f.connectionParams,
|
|
121
121
|
S,
|
|
122
|
-
|
|
122
|
+
C,
|
|
123
|
+
m
|
|
123
124
|
]);
|
|
124
|
-
|
|
125
|
-
let { connectionParams: e, connectionAttemptId: t } =
|
|
126
|
-
!e || t === null ||
|
|
125
|
+
i(() => {
|
|
126
|
+
let { connectionParams: e, connectionAttemptId: t } = f;
|
|
127
|
+
!e || t === null || f.isConnected || f.isConnecting || y || b || f.connectionError || !_ || (h.current = t, v({
|
|
127
128
|
replicaId: e.replicaId,
|
|
128
129
|
sessionId: e.sessionId,
|
|
129
130
|
websocketOptions: {
|
|
130
|
-
...
|
|
131
|
-
model:
|
|
131
|
+
...T,
|
|
132
|
+
model: f.model
|
|
132
133
|
}
|
|
133
134
|
}).then((e) => {
|
|
134
|
-
if (
|
|
135
|
+
if (h.current !== t) {
|
|
135
136
|
e.disconnect();
|
|
136
137
|
return;
|
|
137
138
|
}
|
|
138
|
-
|
|
139
|
+
p({
|
|
139
140
|
type: "CONNECTION_ESTABLISHED",
|
|
140
141
|
payload: e
|
|
141
142
|
});
|
|
142
143
|
}).catch((e) => {
|
|
143
|
-
|
|
144
|
+
p({
|
|
144
145
|
type: "CONNECTION_ERROR",
|
|
145
146
|
payload: e
|
|
146
147
|
}), console.error("Failed to establish WebSocket", e);
|
|
147
148
|
}));
|
|
148
149
|
}, [
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
v,
|
|
150
|
+
f,
|
|
151
|
+
f.connectionParams,
|
|
152
|
+
f.connectionAttemptId,
|
|
153
|
+
f.isConnected,
|
|
154
|
+
f.isConnecting,
|
|
155
155
|
y,
|
|
156
|
-
|
|
156
|
+
b,
|
|
157
157
|
_,
|
|
158
|
-
|
|
158
|
+
v,
|
|
159
|
+
T
|
|
159
160
|
]);
|
|
160
|
-
let
|
|
161
|
-
|
|
162
|
-
let e =
|
|
163
|
-
e && t && (e.replicaId !== t.replicaId || e.sessionId !== t.sessionId) &&
|
|
164
|
-
}, [
|
|
165
|
-
|
|
166
|
-
}, [
|
|
167
|
-
function
|
|
168
|
-
if (!e || !e.api.getSnapshot() || !
|
|
169
|
-
let { columnNames: t, columnOrder: n, rows: r } =
|
|
161
|
+
let D = s(null);
|
|
162
|
+
i(() => {
|
|
163
|
+
let e = D.current, t = f.connectionParams;
|
|
164
|
+
e && t && (e.replicaId !== t.replicaId || e.sessionId !== t.sessionId) && f.websocketInstance?.disconnect(), D.current = t;
|
|
165
|
+
}, [f.connectionParams, f.websocketInstance]), i(() => () => {
|
|
166
|
+
f.websocketInstance?.disconnect(), h.current = null;
|
|
167
|
+
}, [f.websocketInstance]);
|
|
168
|
+
function O(e) {
|
|
169
|
+
if (!e || !e.api.getSnapshot() || !g) return !1;
|
|
170
|
+
let { columnNames: t, columnOrder: n, rows: r } = g, i = t.length >= 1, a = n.length >= 1, o = r.length >= 0;
|
|
170
171
|
return i && a && o;
|
|
171
172
|
}
|
|
172
173
|
return {
|
|
173
|
-
isConnected:
|
|
174
|
-
websocketInstance:
|
|
175
|
-
hasCompletedInitialSync:
|
|
176
|
-
isSyncing:
|
|
177
|
-
model:
|
|
178
|
-
modelSnapshot:
|
|
179
|
-
connect:
|
|
180
|
-
presignedUrl:
|
|
181
|
-
errorEstablishingWebsocketConnection:
|
|
182
|
-
websocketError:
|
|
183
|
-
hasSufficientData:
|
|
174
|
+
isConnected: f.isConnected,
|
|
175
|
+
websocketInstance: f.websocketInstance,
|
|
176
|
+
hasCompletedInitialSync: f.hasCompletedInitialSync,
|
|
177
|
+
isSyncing: f.isSyncing,
|
|
178
|
+
model: f.model,
|
|
179
|
+
modelSnapshot: g,
|
|
180
|
+
connect: E,
|
|
181
|
+
presignedUrl: x,
|
|
182
|
+
errorEstablishingWebsocketConnection: f.connectionError ?? b,
|
|
183
|
+
websocketError: f.websocketError,
|
|
184
|
+
hasSufficientData: O(f.model)
|
|
184
185
|
};
|
|
185
186
|
}
|
|
186
187
|
//#endregion
|
|
187
|
-
export {
|
|
188
|
+
export { u as initialWebSocketState, d as useDataGridWebSocket };
|
|
188
189
|
|
|
189
190
|
//# sourceMappingURL=useDataGridWebsocket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataGridWebsocket.js","names":["GridModel","useCRDTModelView","useCallback","useEffect","useMemo","useReducer","useRef","DataGridWebSocket","useEstablishWebsocketConnection","useDocumentVisibility","WebSocketState","model","hasCompletedInitialSync","isSyncing","isConnected","isConnecting","connectionParams","replicaId","sessionId","websocketInstance","connectionAttemptId","connectionError","websocketError","WebSocketAction","type","payload","attemptId","websocketReducer","state","action","isSameConnection","initialWebSocketState","UseDataGridWebSocketOptions","onGridReady","onReplicaConnected","onReplicaDisconnected","useDataGridWebSocket","options","dispatch","connectionAttemptCounter","activeConnectionAttemptIdRef","modelSnapshot","isDocumentVisible","mutateAsync","establishWebsocketConnection","isPending","isEstablishingWebsocketConnection","error","errorEstablishingWebsocketConnection","presignedUrl","reset","resetEstablishWebsocketConnection","clearPresignedUrl","handleModelCreate","newModel","websocketOptionsWithoutModel","onStatusChange","open","onModelCreate","onSyncStart","onSyncEnd","onError","connect","isDifferentConnection","current","websocketOptions","then","ws","disconnect","catch","err","console","previousConnectionParams","previous","isModelRenderable","api","getSnapshot","columnNames","columnOrder","rows","columnsReady","length","orderReady","rowsReady","hasSufficientData"],"sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"sourcesContent":["import { GridModel } from '@/components/DataGrid/DataGridTypes'\nimport { useCRDTModelView } from '@/components/DataGrid/useCRDTModelView'\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'\nimport { DataGridWebSocket } from './DataGridWebSocket'\nimport { useEstablishWebsocketConnection } from '@/synapse-queries/grid/useEstablishWebsocketConnection'\nimport { useDocumentVisibility } from '@react-hookz/web'\n\n// State type\ninterface WebSocketState {\n model: GridModel | null\n /**\n * True if the WebSocket has finished the initial sync and can process CRDT updates.\n * Corresponds to the `GRID_READY` action.\n */\n hasCompletedInitialSync: boolean\n /**\n * True while a clock-sync exchange is in progress. Set on every outgoing\n * `synchronize-clock` and cleared on `ResponseComplete`, which the server\n * sends once per exchange to signal \"we're synchronized\" — not per request.\n */\n isSyncing: boolean\n isConnected: boolean\n isConnecting: boolean\n connectionParams: {\n replicaId: number\n sessionId: string\n } | null\n websocketInstance: DataGridWebSocket | null\n connectionAttemptId: number | null\n connectionError: unknown\n websocketError: unknown\n}\n\n// Action types\ntype WebSocketAction =\n | {\n type: 'CONNECT_REQUESTED'\n payload: { replicaId: number; sessionId: string; attemptId: number }\n }\n | { type: 'CONNECTION_ESTABLISHED'; payload: DataGridWebSocket }\n | { type: 'CONNECTION_OPENED' }\n | { type: 'CONNECTION_CLOSED' }\n | { type: 'GRID_READY' }\n | { type: 'SYNC_STARTED' }\n | { type: 'SYNC_ENDED' }\n | { type: 'MODEL_CREATED'; payload: GridModel }\n | { type: 'CONNECTION_ERROR'; payload: unknown }\n | { type: 'WEBSOCKET_ERROR'; payload: unknown }\n\n// Reducer function\nfunction websocketReducer(\n state: WebSocketState,\n action: WebSocketAction,\n): WebSocketState {\n switch (action.type) {\n case 'CONNECT_REQUESTED': {\n const isSameConnection =\n state.connectionParams &&\n state.connectionParams.replicaId === action.payload.replicaId &&\n state.connectionParams.sessionId === action.payload.sessionId\n\n return {\n ...state,\n connectionParams: {\n replicaId: action.payload.replicaId,\n sessionId: action.payload.sessionId,\n },\n hasCompletedInitialSync: isSameConnection\n ? state.hasCompletedInitialSync\n : false,\n isSyncing: false,\n model: isSameConnection ? state.model : null,\n isConnected: false,\n isConnecting: false,\n connectionAttemptId: action.payload.attemptId,\n connectionError: null,\n }\n }\n\n case 'CONNECTION_ESTABLISHED':\n return {\n ...state,\n websocketInstance: action.payload,\n isConnecting: true,\n }\n\n case 'CONNECTION_OPENED':\n return {\n ...state,\n isConnected: true,\n isConnecting: false,\n }\n\n case 'CONNECTION_CLOSED':\n return {\n ...state,\n isConnected: false,\n isConnecting: false,\n isSyncing: false,\n }\n\n case 'GRID_READY':\n return {\n ...state,\n hasCompletedInitialSync: true,\n }\n\n case 'SYNC_STARTED':\n return {\n ...state,\n isSyncing: true,\n }\n\n case 'SYNC_ENDED':\n return {\n ...state,\n isSyncing: false,\n }\n\n case 'MODEL_CREATED':\n return {\n ...state,\n model: action.payload,\n }\n\n case 'CONNECTION_ERROR':\n return {\n ...state,\n connectionError: action.payload,\n isConnecting: false,\n }\n\n case 'WEBSOCKET_ERROR':\n return {\n ...state,\n websocketError: action.payload,\n }\n\n default:\n return state\n }\n}\n\nexport const initialWebSocketState: WebSocketState = {\n model: null,\n hasCompletedInitialSync: false,\n isSyncing: false,\n isConnected: false,\n isConnecting: false,\n connectionParams: null,\n websocketInstance: null,\n connectionAttemptId: null,\n connectionError: null,\n websocketError: null,\n}\n\n/**\n * Custom hook to manage a DataGrid WebSocket connection.\n * Handles:\n * - Fetching presigned URLs via a mutation hook\n * - Instantiating the DataGridWebSocket\n * - Connection status tracking\n * - Reconnection on disconnect\n * - Grid model updates and snapshot tracking\n */\nexport interface UseDataGridWebSocketOptions {\n onGridReady?: () => void\n onReplicaConnected?: () => void\n onReplicaDisconnected?: () => void\n}\n\nexport function useDataGridWebSocket(options?: UseDataGridWebSocketOptions) {\n const [state, dispatch] = useReducer(websocketReducer, initialWebSocketState)\n\n const connectionAttemptCounter = useRef(0)\n const activeConnectionAttemptIdRef = useRef<number | null>(null)\n\n const modelSnapshot = useCRDTModelView(state.model)\n\n const isDocumentVisible = useDocumentVisibility()\n\n const {\n mutateAsync: establishWebsocketConnection,\n isPending: isEstablishingWebsocketConnection,\n error: errorEstablishingWebsocketConnection,\n presignedUrl,\n reset: resetEstablishWebsocketConnection,\n clearPresignedUrl,\n } = useEstablishWebsocketConnection()\n\n // Update model creation handler - only set model, don't reset to null on disconnect\n const handleModelCreate = useCallback(\n (newModel: GridModel) => {\n dispatch({ type: 'MODEL_CREATED', payload: newModel })\n },\n [dispatch],\n )\n\n // Memoize websocket options to prevent unnecessary re-renders (excluding model to avoid circular deps)\n const websocketOptionsWithoutModel = useMemo(\n () => ({\n onGridReady: () => {\n dispatch({ type: 'GRID_READY' })\n options?.onGridReady?.()\n },\n onStatusChange: (open: boolean) =>\n dispatch({ type: open ? 'CONNECTION_OPENED' : 'CONNECTION_CLOSED' }),\n onModelCreate: handleModelCreate,\n onReplicaConnected: options?.onReplicaConnected,\n onReplicaDisconnected: options?.onReplicaDisconnected,\n onSyncStart: () => dispatch({ type: 'SYNC_STARTED' }),\n onSyncEnd: () => dispatch({ type: 'SYNC_ENDED' }),\n onError: (error: unknown) =>\n dispatch({ type: 'WEBSOCKET_ERROR', payload: error }),\n }),\n [\n handleModelCreate,\n options?.onGridReady,\n options?.onReplicaConnected,\n options?.onReplicaDisconnected,\n ],\n )\n\n // Initiate (or re-initiate) a connection\n const connect = useCallback(\n (replicaId: number, sessionId: string) => {\n resetEstablishWebsocketConnection()\n\n const isDifferentConnection =\n !state.connectionParams ||\n state.connectionParams.replicaId !== replicaId ||\n state.connectionParams.sessionId !== sessionId\n\n if (isDifferentConnection) {\n clearPresignedUrl()\n }\n\n connectionAttemptCounter.current += 1\n const attemptId = connectionAttemptCounter.current\n\n dispatch({\n type: 'CONNECT_REQUESTED',\n payload: { replicaId, sessionId, attemptId },\n })\n },\n [\n dispatch,\n state.connectionParams,\n resetEstablishWebsocketConnection,\n clearPresignedUrl,\n connectionAttemptCounter,\n ],\n )\n\n /**\n * Establish the WebSocket connection when conditions are met.\n * Uses the current model state at connection time for reconnections to the same session.\n * Note: Changes to `model` alone do NOT trigger reconnection - only changes to connection\n * params, visibility, or connection status will trigger a new connection attempt.\n */\n useEffect(() => {\n // Don't attempt connection if conditions aren't met\n const { connectionParams, connectionAttemptId } = state\n\n if (\n !connectionParams ||\n connectionAttemptId === null ||\n state.isConnected ||\n state.isConnecting ||\n isEstablishingWebsocketConnection ||\n errorEstablishingWebsocketConnection ||\n state.connectionError ||\n !isDocumentVisible\n ) {\n return\n }\n\n activeConnectionAttemptIdRef.current = connectionAttemptId\n\n // Use current model state for reconnections to same session\n // (model may have been created by a previous connection)\n establishWebsocketConnection({\n replicaId: connectionParams.replicaId,\n sessionId: connectionParams.sessionId,\n websocketOptions: {\n ...websocketOptionsWithoutModel,\n model: state.model, // Current model at connection time\n },\n })\n .then(ws => {\n if (activeConnectionAttemptIdRef.current !== connectionAttemptId) {\n ws.disconnect()\n return\n }\n\n dispatch({ type: 'CONNECTION_ESTABLISHED', payload: ws })\n })\n .catch(err => {\n dispatch({ type: 'CONNECTION_ERROR', payload: err })\n console.error('Failed to establish WebSocket', err)\n })\n }, [\n state,\n state.connectionParams,\n state.connectionAttemptId,\n state.isConnected,\n state.isConnecting,\n isEstablishingWebsocketConnection,\n errorEstablishingWebsocketConnection,\n isDocumentVisible,\n establishWebsocketConnection,\n websocketOptionsWithoutModel,\n ])\n\n const previousConnectionParams =\n useRef<WebSocketState['connectionParams']>(null)\n\n useEffect(() => {\n const previous = previousConnectionParams.current\n const current = state.connectionParams\n\n if (\n previous &&\n current &&\n (previous.replicaId !== current.replicaId ||\n previous.sessionId !== current.sessionId)\n ) {\n state.websocketInstance?.disconnect()\n }\n\n previousConnectionParams.current = current\n }, [state.connectionParams, state.websocketInstance])\n\n useEffect(() => {\n return () => {\n state.websocketInstance?.disconnect()\n activeConnectionAttemptIdRef.current = null\n }\n }, [state.websocketInstance])\n\n /**\n * Checks if the model snapshot contains the minimum data required for rendering (columns and rows).\n */\n function isModelRenderable(model: GridModel | null) {\n if (!model || !model.api.getSnapshot() || !modelSnapshot) {\n return false\n }\n const { columnNames, columnOrder, rows } = modelSnapshot\n const columnsReady = columnNames.length >= 1\n const orderReady = columnOrder.length >= 1\n const rowsReady = rows.length >= 0\n return columnsReady && orderReady && rowsReady\n }\n\n return {\n isConnected: state.isConnected,\n websocketInstance: state.websocketInstance,\n hasCompletedInitialSync: state.hasCompletedInitialSync,\n isSyncing: state.isSyncing,\n model: state.model,\n modelSnapshot,\n connect,\n presignedUrl,\n errorEstablishingWebsocketConnection:\n state.connectionError ?? errorEstablishingWebsocketConnection,\n websocketError: state.websocketError,\n hasSufficientData: isModelRenderable(state.model),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDataGridWebsocket.js","names":["GridModel","useCRDTModelView","normalizeWebsocketError","useCallback","useEffect","useMemo","useReducer","useRef","DataGridWebSocket","useEstablishWebsocketConnection","useDocumentVisibility","WebSocketState","model","hasCompletedInitialSync","isSyncing","isConnected","isConnecting","connectionParams","replicaId","sessionId","websocketInstance","connectionAttemptId","connectionError","websocketError","WebSocketAction","type","payload","attemptId","websocketReducer","state","action","isSameConnection","initialWebSocketState","UseDataGridWebSocketOptions","onGridReady","onReplicaConnected","onReplicaDisconnected","useDataGridWebSocket","options","dispatch","connectionAttemptCounter","activeConnectionAttemptIdRef","modelSnapshot","isDocumentVisible","mutateAsync","establishWebsocketConnection","isPending","isEstablishingWebsocketConnection","error","errorEstablishingWebsocketConnection","presignedUrl","reset","resetEstablishWebsocketConnection","clearPresignedUrl","handleModelCreate","newModel","websocketOptionsWithoutModel","onStatusChange","open","onModelCreate","onSyncStart","onSyncEnd","onError","connect","isDifferentConnection","current","websocketOptions","then","ws","disconnect","catch","err","console","previousConnectionParams","previous","isModelRenderable","api","getSnapshot","columnNames","columnOrder","rows","columnsReady","length","orderReady","rowsReady","hasSufficientData"],"sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"sourcesContent":["import { GridModel } from '@/components/DataGrid/DataGridTypes'\nimport { useCRDTModelView } from '@/components/DataGrid/useCRDTModelView'\nimport { normalizeWebsocketError } from '@/components/DataGrid/utils/normalizeWebsocketError'\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'\nimport { DataGridWebSocket } from './DataGridWebSocket'\nimport { useEstablishWebsocketConnection } from '@/synapse-queries/grid/useEstablishWebsocketConnection'\nimport { useDocumentVisibility } from '@react-hookz/web'\n\n// State type\ninterface WebSocketState {\n model: GridModel | null\n /**\n * True if the WebSocket has finished the initial sync and can process CRDT updates.\n * Corresponds to the `GRID_READY` action.\n */\n hasCompletedInitialSync: boolean\n /**\n * True while a clock-sync exchange is in progress. Set on every outgoing\n * `synchronize-clock` and cleared on `ResponseComplete`, which the server\n * sends once per exchange to signal \"we're synchronized\" — not per request.\n */\n isSyncing: boolean\n isConnected: boolean\n isConnecting: boolean\n connectionParams: {\n replicaId: number\n sessionId: string\n } | null\n websocketInstance: DataGridWebSocket | null\n connectionAttemptId: number | null\n connectionError: unknown\n websocketError: unknown\n}\n\n// Action types\ntype WebSocketAction =\n | {\n type: 'CONNECT_REQUESTED'\n payload: { replicaId: number; sessionId: string; attemptId: number }\n }\n | { type: 'CONNECTION_ESTABLISHED'; payload: DataGridWebSocket }\n | { type: 'CONNECTION_OPENED' }\n | { type: 'CONNECTION_CLOSED' }\n | { type: 'GRID_READY' }\n | { type: 'SYNC_STARTED' }\n | { type: 'SYNC_ENDED' }\n | { type: 'MODEL_CREATED'; payload: GridModel }\n | { type: 'CONNECTION_ERROR'; payload: unknown }\n | { type: 'WEBSOCKET_ERROR'; payload: unknown }\n\n// Reducer function\nfunction websocketReducer(\n state: WebSocketState,\n action: WebSocketAction,\n): WebSocketState {\n switch (action.type) {\n case 'CONNECT_REQUESTED': {\n const isSameConnection =\n state.connectionParams &&\n state.connectionParams.replicaId === action.payload.replicaId &&\n state.connectionParams.sessionId === action.payload.sessionId\n\n return {\n ...state,\n connectionParams: {\n replicaId: action.payload.replicaId,\n sessionId: action.payload.sessionId,\n },\n hasCompletedInitialSync: isSameConnection\n ? state.hasCompletedInitialSync\n : false,\n isSyncing: false,\n model: isSameConnection ? state.model : null,\n isConnected: false,\n isConnecting: false,\n connectionAttemptId: action.payload.attemptId,\n connectionError: null,\n }\n }\n\n case 'CONNECTION_ESTABLISHED':\n return {\n ...state,\n websocketInstance: action.payload,\n isConnecting: true,\n }\n\n case 'CONNECTION_OPENED':\n return {\n ...state,\n isConnected: true,\n isConnecting: false,\n }\n\n case 'CONNECTION_CLOSED':\n return {\n ...state,\n isConnected: false,\n isConnecting: false,\n isSyncing: false,\n }\n\n case 'GRID_READY':\n return {\n ...state,\n hasCompletedInitialSync: true,\n }\n\n case 'SYNC_STARTED':\n return {\n ...state,\n isSyncing: true,\n }\n\n case 'SYNC_ENDED':\n return {\n ...state,\n isSyncing: false,\n }\n\n case 'MODEL_CREATED':\n return {\n ...state,\n model: action.payload,\n }\n\n case 'CONNECTION_ERROR':\n return {\n ...state,\n connectionError: action.payload,\n isConnecting: false,\n }\n\n case 'WEBSOCKET_ERROR':\n return {\n ...state,\n websocketError: action.payload,\n }\n\n default:\n return state\n }\n}\n\nexport const initialWebSocketState: WebSocketState = {\n model: null,\n hasCompletedInitialSync: false,\n isSyncing: false,\n isConnected: false,\n isConnecting: false,\n connectionParams: null,\n websocketInstance: null,\n connectionAttemptId: null,\n connectionError: null,\n websocketError: null,\n}\n\n/**\n * Custom hook to manage a DataGrid WebSocket connection.\n * Handles:\n * - Fetching presigned URLs via a mutation hook\n * - Instantiating the DataGridWebSocket\n * - Connection status tracking\n * - Reconnection on disconnect\n * - Grid model updates and snapshot tracking\n */\nexport interface UseDataGridWebSocketOptions {\n onGridReady?: () => void\n onReplicaConnected?: () => void\n onReplicaDisconnected?: () => void\n}\n\nexport function useDataGridWebSocket(options?: UseDataGridWebSocketOptions) {\n const [state, dispatch] = useReducer(websocketReducer, initialWebSocketState)\n\n const connectionAttemptCounter = useRef(0)\n const activeConnectionAttemptIdRef = useRef<number | null>(null)\n\n const modelSnapshot = useCRDTModelView(state.model)\n\n const isDocumentVisible = useDocumentVisibility()\n\n const {\n mutateAsync: establishWebsocketConnection,\n isPending: isEstablishingWebsocketConnection,\n error: errorEstablishingWebsocketConnection,\n presignedUrl,\n reset: resetEstablishWebsocketConnection,\n clearPresignedUrl,\n } = useEstablishWebsocketConnection()\n\n // Update model creation handler - only set model, don't reset to null on disconnect\n const handleModelCreate = useCallback(\n (newModel: GridModel) => {\n dispatch({ type: 'MODEL_CREATED', payload: newModel })\n },\n [dispatch],\n )\n\n // Memoize websocket options to prevent unnecessary re-renders (excluding model to avoid circular deps)\n const websocketOptionsWithoutModel = useMemo(\n () => ({\n onGridReady: () => {\n dispatch({ type: 'GRID_READY' })\n options?.onGridReady?.()\n },\n onStatusChange: (open: boolean) =>\n dispatch({ type: open ? 'CONNECTION_OPENED' : 'CONNECTION_CLOSED' }),\n onModelCreate: handleModelCreate,\n onReplicaConnected: options?.onReplicaConnected,\n onReplicaDisconnected: options?.onReplicaDisconnected,\n onSyncStart: () => dispatch({ type: 'SYNC_STARTED' }),\n onSyncEnd: () => dispatch({ type: 'SYNC_ENDED' }),\n onError: (error: unknown) =>\n dispatch({\n type: 'WEBSOCKET_ERROR',\n payload: normalizeWebsocketError(error),\n }),\n }),\n [\n handleModelCreate,\n options?.onGridReady,\n options?.onReplicaConnected,\n options?.onReplicaDisconnected,\n ],\n )\n\n // Initiate (or re-initiate) a connection\n const connect = useCallback(\n (replicaId: number, sessionId: string) => {\n resetEstablishWebsocketConnection()\n\n const isDifferentConnection =\n !state.connectionParams ||\n state.connectionParams.replicaId !== replicaId ||\n state.connectionParams.sessionId !== sessionId\n\n if (isDifferentConnection) {\n clearPresignedUrl()\n }\n\n connectionAttemptCounter.current += 1\n const attemptId = connectionAttemptCounter.current\n\n dispatch({\n type: 'CONNECT_REQUESTED',\n payload: { replicaId, sessionId, attemptId },\n })\n },\n [\n dispatch,\n state.connectionParams,\n resetEstablishWebsocketConnection,\n clearPresignedUrl,\n connectionAttemptCounter,\n ],\n )\n\n /**\n * Establish the WebSocket connection when conditions are met.\n * Uses the current model state at connection time for reconnections to the same session.\n * Note: Changes to `model` alone do NOT trigger reconnection - only changes to connection\n * params, visibility, or connection status will trigger a new connection attempt.\n */\n useEffect(() => {\n // Don't attempt connection if conditions aren't met\n const { connectionParams, connectionAttemptId } = state\n\n if (\n !connectionParams ||\n connectionAttemptId === null ||\n state.isConnected ||\n state.isConnecting ||\n isEstablishingWebsocketConnection ||\n errorEstablishingWebsocketConnection ||\n state.connectionError ||\n !isDocumentVisible\n ) {\n return\n }\n\n activeConnectionAttemptIdRef.current = connectionAttemptId\n\n // Use current model state for reconnections to same session\n // (model may have been created by a previous connection)\n establishWebsocketConnection({\n replicaId: connectionParams.replicaId,\n sessionId: connectionParams.sessionId,\n websocketOptions: {\n ...websocketOptionsWithoutModel,\n model: state.model, // Current model at connection time\n },\n })\n .then(ws => {\n if (activeConnectionAttemptIdRef.current !== connectionAttemptId) {\n ws.disconnect()\n return\n }\n\n dispatch({ type: 'CONNECTION_ESTABLISHED', payload: ws })\n })\n .catch(err => {\n dispatch({ type: 'CONNECTION_ERROR', payload: err })\n console.error('Failed to establish WebSocket', err)\n })\n }, [\n state,\n state.connectionParams,\n state.connectionAttemptId,\n state.isConnected,\n state.isConnecting,\n isEstablishingWebsocketConnection,\n errorEstablishingWebsocketConnection,\n isDocumentVisible,\n establishWebsocketConnection,\n websocketOptionsWithoutModel,\n ])\n\n const previousConnectionParams =\n useRef<WebSocketState['connectionParams']>(null)\n\n useEffect(() => {\n const previous = previousConnectionParams.current\n const current = state.connectionParams\n\n if (\n previous &&\n current &&\n (previous.replicaId !== current.replicaId ||\n previous.sessionId !== current.sessionId)\n ) {\n state.websocketInstance?.disconnect()\n }\n\n previousConnectionParams.current = current\n }, [state.connectionParams, state.websocketInstance])\n\n useEffect(() => {\n return () => {\n state.websocketInstance?.disconnect()\n activeConnectionAttemptIdRef.current = null\n }\n }, [state.websocketInstance])\n\n /**\n * Checks if the model snapshot contains the minimum data required for rendering (columns and rows).\n */\n function isModelRenderable(model: GridModel | null) {\n if (!model || !model.api.getSnapshot() || !modelSnapshot) {\n return false\n }\n const { columnNames, columnOrder, rows } = modelSnapshot\n const columnsReady = columnNames.length >= 1\n const orderReady = columnOrder.length >= 1\n const rowsReady = rows.length >= 0\n return columnsReady && orderReady && rowsReady\n }\n\n return {\n isConnected: state.isConnected,\n websocketInstance: state.websocketInstance,\n hasCompletedInitialSync: state.hasCompletedInitialSync,\n isSyncing: state.isSyncing,\n model: state.model,\n modelSnapshot,\n connect,\n presignedUrl,\n errorEstablishingWebsocketConnection:\n state.connectionError ?? errorEstablishingWebsocketConnection,\n websocketError: state.websocketError,\n hasSufficientData: isModelRenderable(state.model),\n }\n}\n"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ type ColumnConfig = {
|
|
|
13
13
|
showPinIcon?: boolean;
|
|
14
14
|
isPinned?: boolean;
|
|
15
15
|
onTogglePin?: () => void;
|
|
16
|
+
isUpsertKey?: boolean;
|
|
16
17
|
/**
|
|
17
18
|
* Optional column-level schema info. When provided, paste behavior coerces
|
|
18
19
|
* empty pasted cells to the schema-correct blank (undefined for optional
|
|
@@ -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,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;
|
|
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,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC,CAAA;AAgMD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGzD"}
|
|
@@ -53,8 +53,8 @@ function g(e, t) {
|
|
|
53
53
|
}
|
|
54
54
|
return n.displayName = `CellWithTooltip(${t})`, n;
|
|
55
55
|
}
|
|
56
|
-
function _(e) {
|
|
57
|
-
return e ? "header-cell-required" : "header-cell";
|
|
56
|
+
function _(e, t) {
|
|
57
|
+
return t ? "header-upsert-key" : e ? "header-cell-required" : "header-cell";
|
|
58
58
|
}
|
|
59
59
|
function v(e, t) {
|
|
60
60
|
return ({ rowData: n }) => ({
|
|
@@ -79,11 +79,13 @@ function b(e, t) {
|
|
|
79
79
|
title: /* @__PURE__ */ l(i, {
|
|
80
80
|
name: e.columnName,
|
|
81
81
|
description: e.description,
|
|
82
|
+
isRequired: e.isRequired,
|
|
83
|
+
isUpsertKey: e.isUpsertKey,
|
|
82
84
|
showPinIcon: e.showPinIcon,
|
|
83
85
|
isPinned: e.isPinned,
|
|
84
86
|
onTogglePin: e.onTogglePin
|
|
85
87
|
}),
|
|
86
|
-
headerClassName: _(e.isRequired),
|
|
88
|
+
headerClassName: _(e.isRequired, !!e.isUpsertKey),
|
|
87
89
|
minWidth: a,
|
|
88
90
|
basis: a,
|
|
89
91
|
grow: 0,
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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","isUpsertKey","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 isUpsertKey?: boolean\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, isUpsertKey: boolean): string {\n return isUpsertKey\n ? 'header-upsert-key'\n : isRequired\n ? 'header-cell-required'\n : '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 isRequired={config.isRequired}\n isUpsertKey={config.isUpsertKey}\n showPinIcon={config.showPinIcon}\n isPinned={config.isPinned}\n onTogglePin={config.onTogglePin}\n />\n ),\n headerClassName: getHeaderClassName(\n config.isRequired,\n !!config.isUpsertKey,\n ),\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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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Column } from '@sage-bionetworks/react-datasheet-grid';
|
|
2
2
|
import { SchemaPropertiesMap } from '@/utils/jsonschema/getSchemaPropertyInfo';
|
|
3
|
-
export declare function modelColsToGrid(columnNames: string[], columnOrder: number[], schemaPropertiesInfo: SchemaPropertiesMap, columnWidths?: Record<string, number>, pinnedColumns?: Set<number>, onTogglePin?: (columnIndex: number) => void): Column[];
|
|
3
|
+
export declare function modelColsToGrid(columnNames: string[], columnOrder: number[], schemaPropertiesInfo: SchemaPropertiesMap, columnWidths?: Record<string, number>, pinnedColumns?: Set<number>, onTogglePin?: (columnIndex: number) => void, upsertKey?: string[]): Column[];
|
|
4
4
|
//# sourceMappingURL=modelColsToGrid.d.ts.map
|
|
@@ -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,
|
|
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,EAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,MAAM,EAAE,CAwBV"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { createColumn as e } from "./columnFactory.js";
|
|
2
2
|
//#region src/components/DataGrid/utils/modelColsToGrid.ts
|
|
3
|
-
function t(t, n, r, i = {}, a = /* @__PURE__ */ new Set(), o) {
|
|
4
|
-
return n.map((n,
|
|
5
|
-
let
|
|
3
|
+
function t(t, n, r, i = {}, a = /* @__PURE__ */ new Set(), o, s) {
|
|
4
|
+
return n.map((n, c) => {
|
|
5
|
+
let l = t[n], u = r[l], d = c === 0 && o !== void 0, f = a.has(c);
|
|
6
6
|
return e({
|
|
7
|
-
columnName:
|
|
8
|
-
description:
|
|
9
|
-
typeInfo:
|
|
10
|
-
enumeratedValues:
|
|
11
|
-
isRequired:
|
|
12
|
-
disabled:
|
|
13
|
-
customWidth: i[
|
|
14
|
-
showPinIcon:
|
|
15
|
-
isPinned:
|
|
16
|
-
onTogglePin: o ? () => o(
|
|
17
|
-
schemaPropertyInfo:
|
|
7
|
+
columnName: l,
|
|
8
|
+
description: u?.description,
|
|
9
|
+
typeInfo: u?.type || null,
|
|
10
|
+
enumeratedValues: u?.enumeratedValues || [],
|
|
11
|
+
isRequired: u?.isRequired || !1,
|
|
12
|
+
disabled: u?.type?.readOnly,
|
|
13
|
+
customWidth: i[l],
|
|
14
|
+
showPinIcon: d,
|
|
15
|
+
isPinned: f,
|
|
16
|
+
onTogglePin: o ? () => o(c) : void 0,
|
|
17
|
+
schemaPropertyInfo: u,
|
|
18
|
+
isUpsertKey: s?.includes(l) ?? !1
|
|
18
19
|
});
|
|
19
20
|
});
|
|
20
21
|
}
|
|
@@ -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","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,CAAC,GACxCE,oBAA6B,IAAIC,IAAI,GACrCC,GACU;CACV,
|
|
1
|
+
{"version":3,"file":"modelColsToGrid.js","names":["Column","createColumn","SchemaPropertiesMap","modelColsToGrid","columnNames","columnOrder","schemaPropertiesInfo","columnWidths","Record","pinnedColumns","Set","onTogglePin","columnIndex","upsertKey","map","index","arrayIndex","columnName","propertyInfo","showPinIcon","undefined","isPinned","has","description","typeInfo","type","enumeratedValues","isRequired","disabled","readOnly","customWidth","schemaPropertyInfo","isUpsertKey","includes"],"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 upsertKey?: string[],\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 isUpsertKey: upsertKey?.includes(columnName) ?? false,\n })\n })\n}\n"],"mappings":";;AAIA,SAAgBG,EACdC,GACAC,GACAC,GACAC,IAAuC,CAAC,GACxCE,oBAA6B,IAAIC,IAAI,GACrCC,GACAE,GACU;CACV,OAAOR,EAAYS,KAAKC,GAAeC,MAAuB;EAC5D,IAAMC,IAAab,EAAYW,IACzBG,IAAeZ,EAAqBW,IAGpCE,IAAcH,MAAe,KAAKL,MAAgBS,KAAAA,GAClDC,IAAWZ,EAAca,IAAIN,CAAU;EAE7C,OAAOf,EAAa;GAClBgB;GACAM,aAAaL,GAAcK;GAC3BC,UAAUN,GAAcO,QAAQ;GAChCC,kBAAkBR,GAAcQ,oBAAoB,CAAA;GACpDC,YAAYT,GAAcS,cAAc;GACxCC,UAAUV,GAAcO,MAAMI;GAC9BC,aAAavB,EAAaU;GAC1BE;GACAE;GACAV,aAAaA,UAAoBA,EAAYK,CAAU,IAAII,KAAAA;GAC3DW,oBAAoBb;GACpBc,aAAanB,GAAWoB,SAAShB,CAAU,KAAK;EAClD,CAAC;CACH,CAAC;AACH"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The server sends error notifications as plain objects `{message, code, errno}`.
|
|
3
|
+
* Convert those to proper Error instances so error boundaries can render the message.
|
|
4
|
+
* Non-conforming values are returned unchanged.
|
|
5
|
+
*/
|
|
6
|
+
export declare function normalizeWebsocketError(error: unknown): unknown;
|
|
7
|
+
//# sourceMappingURL=normalizeWebsocketError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeWebsocketError.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/normalizeWebsocketError.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU/D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/components/DataGrid/utils/normalizeWebsocketError.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
return typeof e == "object" && e && "message" in e && typeof e.message == "string" ? Error(e.message) : e;
|
|
4
|
+
}
|
|
5
|
+
//#endregion
|
|
6
|
+
export { e as normalizeWebsocketError };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=normalizeWebsocketError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeWebsocketError.js","names":["normalizeWebsocketError","error","message","Error"],"sources":["../../../../src/components/DataGrid/utils/normalizeWebsocketError.ts"],"sourcesContent":["/**\n * The server sends error notifications as plain objects `{message, code, errno}`.\n * Convert those to proper Error instances so error boundaries can render the message.\n * Non-conforming values are returned unchanged.\n */\nexport function normalizeWebsocketError(error: unknown): unknown {\n if (\n error != null &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof (error as { message: unknown }).message === 'string'\n ) {\n return new Error((error as { message: string }).message)\n }\n return error\n}\n"],"mappings":";AAKA,SAAgBA,EAAwBC,GAAyB;CAS/D,OANE,OAAOA,KAAU,YADjBA,KAEA,aAAaA,KACb,OAAQA,EAA+BC,WAAY,WAExCC,MAAOF,EAA8BC,OAAO,IAElDD;AACT"}
|
|
@@ -39,6 +39,8 @@ export type GenericCardProps = {
|
|
|
39
39
|
cardTopContent?: React.ReactNode;
|
|
40
40
|
/** Optional slot for adding action buttons to the top of the card */
|
|
41
41
|
cardTopButtons?: React.ReactNode;
|
|
42
|
+
/** Optional position of CTA link(s) */
|
|
43
|
+
ctaLinkPosition?: 'right';
|
|
42
44
|
/** If true, a HeaderCard component will be rendered */
|
|
43
45
|
isHeader?: boolean;
|
|
44
46
|
/** The variant of HeaderCard to render if `isHeader` is true */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenericCard.d.ts","sourceRoot":"","sources":["../../../src/components/GenericCard/GenericCard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAA;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAoC,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAG7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oDAAoD,CAAA;AAIjG,kHAAkH;AAClH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,0FAA0F;IAC1F,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,sBAAsB,CAAC,EAAE;QACvB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,6FAA6F;IAC7F,kCAAkC,CAAC,EAAE;QACnC,sEAAsE;QACtE,qBAAqB,EAAE,qBAAqB,CAAA;QAC5C,gDAAgD;QAChD,gBAAgB,EAAE,OAAO,CAAA;KAC1B,CAAA;IACD,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,qEAAqE;IACrE,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC;wBACoB;IACpB,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC;;OAEG;IACH,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE,CAAA;IAC/C;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC;;OAEG;IACH,uBAAuB,CAAC,EAAE,4BAA4B,CAAA;IACtD;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACnC;;OAEG;IACH,qBAAqB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAID;;GAEG;AACH,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"GenericCard.d.ts","sourceRoot":"","sources":["../../../src/components/GenericCard/GenericCard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAA;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAoC,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAG7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oDAAoD,CAAA;AAIjG,kHAAkH;AAClH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,0FAA0F;IAC1F,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,sBAAsB,CAAC,EAAE;QACvB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,6FAA6F;IAC7F,kCAAkC,CAAC,EAAE;QACnC,sEAAsE;QACtE,qBAAqB,EAAE,qBAAqB,CAAA;QAC5C,gDAAgD;QAChD,gBAAgB,EAAE,OAAO,CAAA;KAC1B,CAAA;IACD,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,qEAAqE;IACrE,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC;wBACoB;IACpB,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC;;OAEG;IACH,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE,CAAA;IAC/C;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC;;OAEG;IACH,uBAAuB,CAAC,EAAE,4BAA4B,CAAA;IACtD;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACnC;;OAEG;IACH,qBAAqB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAID;;GAEG;AACH,eAAO,MAAM,WAAW,yFAmLtB,CAAA;AAEF,eAAe,WAAW,CAAA"}
|