synapse-react-client 4.0.6 → 4.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js +3 -4
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +2 -3
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.css +1 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts +8 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts.map +1 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js +21 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js.map +1 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss +32 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js +14 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js.map +1 -0
- package/dist/components/ColoredBulletListItem/index.d.ts +5 -0
- package/dist/components/ColoredBulletListItem/index.d.ts.map +1 -0
- package/dist/components/ColoredBulletListItem/index.js +6 -0
- package/dist/components/ColoredBulletListItem/index.js.map +1 -0
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +3 -4
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js +120 -46
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts +7 -0
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts.map +1 -0
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js +132 -0
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js.map +1 -0
- package/dist/components/DataGrid/DataGrid.d.ts +2 -0
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGrid.js +69 -67
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/DataGridTypes.d.ts +8 -2
- package/dist/components/DataGrid/DataGridTypes.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridTypes.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +2 -3
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +184 -164
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +2 -3
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridReplicaUsers.d.ts +15 -0
- package/dist/components/DataGrid/hooks/useGridReplicaUsers.d.ts.map +1 -0
- package/dist/components/DataGrid/hooks/useGridReplicaUsers.js +55 -0
- package/dist/components/DataGrid/hooks/useGridReplicaUsers.js.map +1 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts +16 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts.map +1 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.js +30 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.js.map +1 -0
- package/dist/components/DataGrid/utils/DataGridUtils.js +31 -31
- package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +28 -23
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +90 -49
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.d.ts +14 -0
- package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.js +24 -0
- package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.js.map +1 -0
- package/dist/components/DataGrid/utils/getCellAuthorSid.d.ts +7 -0
- package/dist/components/DataGrid/utils/getCellAuthorSid.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getCellAuthorSid.js +11 -0
- package/dist/components/DataGrid/utils/getCellAuthorSid.js.map +1 -0
- package/dist/components/DataGrid/utils/getCellClassName.d.ts +2 -0
- package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.js +23 -12
- package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
- package/dist/components/DataGrid/utils/getChangeTooltipText.d.ts +7 -0
- package/dist/components/DataGrid/utils/getChangeTooltipText.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getChangeTooltipText.js +18 -0
- package/dist/components/DataGrid/utils/getChangeTooltipText.js.map +1 -0
- package/dist/components/DataGrid/utils/getReplicaCategory.d.ts +12 -0
- package/dist/components/DataGrid/utils/getReplicaCategory.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getReplicaCategory.js +13 -0
- package/dist/components/DataGrid/utils/getReplicaCategory.js.map +1 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts +15 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js +43 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js.map +1 -0
- package/dist/components/DialogBase.d.ts +3 -1
- package/dist/components/DialogBase.d.ts.map +1 -1
- package/dist/components/DialogBase.js +75 -56
- package/dist/components/DialogBase.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemSkeleton.js +2 -3
- package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +2 -3
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +2 -3
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +3 -4
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/HeaderCard.js +2 -3
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +168 -165
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js +3 -4
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts +1 -0
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts.map +1 -1
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js +23 -16
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
- package/dist/components/TextField/TextField.css +1 -1
- package/dist/components/TextField/TextField.d.ts +1 -0
- package/dist/components/TextField/TextField.d.ts.map +1 -1
- package/dist/components/TextField/TextField.js +32 -20
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TextField/TextField.module.scss +7 -0
- package/dist/components/TextField/TextField.module.scss.js +5 -3
- package/dist/components/TextField/TextField.module.scss.js.map +1 -1
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +2 -3
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +242 -240
- package/dist/components/index.js.map +1 -1
- package/dist/components/styled/StyledFormControl.js +1 -1
- package/dist/components/styled/StyledFormControl.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +2 -3
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +2 -3
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/features/curator/GridPage/GridPage.js +2 -3
- package/dist/features/curator/GridPage/GridPage.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +2 -3
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -180
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +2 -3
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js +4 -8
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js.map +1 -1
- package/dist/index.js +306 -304
- package/dist/index.js.map +1 -1
- package/dist/style/components/_data-grid-extra.css +1 -1
- package/dist/style/components/_data-grid-extra.scss +49 -0
- package/dist/synapse-client/SynapseClient.d.ts +1 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +3 -2
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/index.js +42 -41
- package/dist/synapse-queries/user/index.js +17 -16
- package/dist/synapse-queries/user/useUserBundle.d.ts +9 -0
- package/dist/synapse-queries/user/useUserBundle.d.ts.map +1 -1
- package/dist/synapse-queries/user/useUserBundle.js +45 -37
- package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
- package/dist/theme/palette/Palettes.d.ts +2 -0
- package/dist/theme/palette/Palettes.d.ts.map +1 -1
- package/dist/theme/palette/Palettes.js +46 -40
- package/dist/theme/palette/Palettes.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/assets/ArcusBioIcon.svg +0 -1
- package/dist/assets/ArcusBioIcon.svg.js +0 -7
- package/dist/assets/ArcusBioIcon.svg.js.map +0 -1
|
@@ -1,39 +1,80 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { dateTimeColumn as
|
|
3
|
-
import { createTextColumn as
|
|
4
|
-
import { autocompleteColumn as
|
|
5
|
-
import { autocompleteMultipleEnumColumn as
|
|
6
|
-
import { calculateDefaultColumnWidth as
|
|
7
|
-
import { ColumnHeaderWithTooltip as
|
|
8
|
-
|
|
1
|
+
import { jsx as i, jsxs as d, Fragment as p } from "react/jsx-runtime";
|
|
2
|
+
import { dateTimeColumn as c } from "../columns/DateTimeColumn.js";
|
|
3
|
+
import { createTextColumn as h, keyColumn as y, floatColumn as T } from "@sage-bionetworks/react-datasheet-grid";
|
|
4
|
+
import { autocompleteColumn as a } from "../columns/AutocompleteColumn.js";
|
|
5
|
+
import { autocompleteMultipleEnumColumn as C } from "../columns/AutocompleteMultipleEnumColumn.js";
|
|
6
|
+
import { calculateDefaultColumnWidth as s } from "./calculateColumnWidth.js";
|
|
7
|
+
import { ColumnHeaderWithTooltip as I } from "../components/ColumnHeaderWithTooltip.js";
|
|
8
|
+
import { Tooltip as m } from "@mui/material";
|
|
9
|
+
import { SmartToyTwoTone as w } from "@mui/icons-material";
|
|
10
|
+
function b(e, t) {
|
|
11
|
+
function n(r) {
|
|
12
|
+
const o = r.rowData.__cellChangeInfo?.[t], u = o?.category === "own-agent" || o?.category === "other-agent";
|
|
13
|
+
return /* @__PURE__ */ d(p, { children: [
|
|
14
|
+
/* @__PURE__ */ i(e, { ...r }),
|
|
15
|
+
o && !u && /* @__PURE__ */ i(m, { title: o.tooltipText, placement: "top-end", children: /* @__PURE__ */ i(
|
|
16
|
+
"div",
|
|
17
|
+
{
|
|
18
|
+
style: {
|
|
19
|
+
position: "absolute",
|
|
20
|
+
top: 0,
|
|
21
|
+
right: 0,
|
|
22
|
+
width: 7,
|
|
23
|
+
height: 7,
|
|
24
|
+
zIndex: 21,
|
|
25
|
+
pointerEvents: "auto"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
) }),
|
|
29
|
+
u && !r.focus && /* @__PURE__ */ i(m, { title: o.tooltipText, placement: "left", children: /* @__PURE__ */ i(
|
|
30
|
+
w,
|
|
31
|
+
{
|
|
32
|
+
sx: {
|
|
33
|
+
fontSize: "1em",
|
|
34
|
+
alignSelf: "center",
|
|
35
|
+
flexShrink: 0,
|
|
36
|
+
mr: 0.5,
|
|
37
|
+
zIndex: 21,
|
|
38
|
+
pointerEvents: "auto",
|
|
39
|
+
color: "grey.400",
|
|
40
|
+
backgroundColor: "transparent"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
) })
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
return n.displayName = `CellWithTooltip(${t})`, n;
|
|
47
|
+
}
|
|
48
|
+
function x(e) {
|
|
9
49
|
return e ? "header-cell-required" : "header-cell";
|
|
10
50
|
}
|
|
11
|
-
function
|
|
12
|
-
return ({ rowData:
|
|
13
|
-
...
|
|
51
|
+
function P(e, t) {
|
|
52
|
+
return ({ rowData: n }) => ({
|
|
53
|
+
...n,
|
|
14
54
|
[e]: t ? null : void 0
|
|
15
55
|
});
|
|
16
56
|
}
|
|
17
|
-
function
|
|
57
|
+
function v(e) {
|
|
18
58
|
return (t) => {
|
|
19
|
-
const
|
|
20
|
-
return
|
|
59
|
+
const n = t.trim();
|
|
60
|
+
return n === "" ? e ? null : void 0 : n;
|
|
21
61
|
};
|
|
22
62
|
}
|
|
23
|
-
function
|
|
24
|
-
const
|
|
63
|
+
function l(e, t) {
|
|
64
|
+
const n = {
|
|
25
65
|
showPinIcon: e.showPinIcon,
|
|
26
66
|
hasDescription: !!e.description
|
|
27
|
-
},
|
|
67
|
+
}, r = e.customWidth ?? s(
|
|
28
68
|
e.columnName,
|
|
29
69
|
void 0,
|
|
30
70
|
// propertyInfo is not available here, passed from higher level
|
|
31
|
-
|
|
32
|
-
);
|
|
71
|
+
n
|
|
72
|
+
), o = y(e.columnName, t);
|
|
33
73
|
return {
|
|
34
|
-
...
|
|
35
|
-
|
|
36
|
-
|
|
74
|
+
...o,
|
|
75
|
+
component: b(o.component, e.columnName),
|
|
76
|
+
title: /* @__PURE__ */ i(
|
|
77
|
+
I,
|
|
37
78
|
{
|
|
38
79
|
name: e.columnName,
|
|
39
80
|
description: e.description,
|
|
@@ -42,83 +83,83 @@ function u(e, t) {
|
|
|
42
83
|
onTogglePin: e.onTogglePin
|
|
43
84
|
}
|
|
44
85
|
),
|
|
45
|
-
headerClassName:
|
|
46
|
-
minWidth:
|
|
47
|
-
basis:
|
|
86
|
+
headerClassName: x(e.isRequired),
|
|
87
|
+
minWidth: r,
|
|
88
|
+
basis: r,
|
|
48
89
|
grow: 0,
|
|
49
90
|
shrink: 0,
|
|
50
91
|
disabled: e.disabled,
|
|
51
|
-
deleteValue:
|
|
92
|
+
deleteValue: P(e.columnName, e.isRequired),
|
|
52
93
|
stickyLeft: e.isPinned
|
|
53
94
|
};
|
|
54
95
|
}
|
|
55
|
-
const
|
|
56
|
-
multipleEnum: (e) =>
|
|
96
|
+
const N = {
|
|
97
|
+
multipleEnum: (e) => l(
|
|
57
98
|
e,
|
|
58
|
-
|
|
99
|
+
C({
|
|
59
100
|
choices: e.enumeratedValues ?? [],
|
|
60
101
|
colType: e.typeInfo?.type || null,
|
|
61
102
|
limitTags: 3,
|
|
62
103
|
clearValue: e.isRequired ? null : void 0
|
|
63
104
|
})
|
|
64
105
|
),
|
|
65
|
-
boolean: (e) =>
|
|
106
|
+
boolean: (e) => l(
|
|
66
107
|
e,
|
|
67
|
-
|
|
108
|
+
a({
|
|
68
109
|
choices: [!0, !1],
|
|
69
110
|
colType: "boolean",
|
|
70
111
|
clearValue: e.isRequired ? null : void 0
|
|
71
112
|
})
|
|
72
113
|
),
|
|
73
|
-
number: (e) =>
|
|
74
|
-
enumerated: (e) =>
|
|
114
|
+
number: (e) => l(e, T),
|
|
115
|
+
enumerated: (e) => l(
|
|
75
116
|
e,
|
|
76
|
-
|
|
117
|
+
a({
|
|
77
118
|
choices: e.enumeratedValues ?? [],
|
|
78
119
|
colType: e.typeInfo?.type || null,
|
|
79
120
|
clearValue: e.isRequired ? null : void 0
|
|
80
121
|
})
|
|
81
122
|
),
|
|
82
123
|
"date-time": (e) => {
|
|
83
|
-
const t =
|
|
124
|
+
const t = c({
|
|
84
125
|
colType: e.typeInfo?.type || null
|
|
85
|
-
}),
|
|
126
|
+
}), n = {
|
|
86
127
|
showPinIcon: e.showPinIcon,
|
|
87
128
|
hasDescription: !!e.description
|
|
88
|
-
},
|
|
129
|
+
}, r = e.customWidth ?? s(
|
|
89
130
|
e.columnName,
|
|
90
131
|
{
|
|
91
132
|
type: e.typeInfo ?? void 0,
|
|
92
133
|
isRequired: e.isRequired
|
|
93
134
|
},
|
|
94
|
-
|
|
135
|
+
n
|
|
95
136
|
);
|
|
96
137
|
return {
|
|
97
|
-
...
|
|
98
|
-
minWidth:
|
|
99
|
-
basis:
|
|
138
|
+
...l(e, t),
|
|
139
|
+
minWidth: r,
|
|
140
|
+
basis: r
|
|
100
141
|
};
|
|
101
142
|
},
|
|
102
143
|
text: (e) => {
|
|
103
|
-
const t =
|
|
144
|
+
const t = h({
|
|
104
145
|
continuousUpdates: !1,
|
|
105
146
|
deletedValue: void 0,
|
|
106
|
-
parseUserInput:
|
|
147
|
+
parseUserInput: v(e.isRequired)
|
|
107
148
|
});
|
|
108
149
|
return {
|
|
109
|
-
...
|
|
150
|
+
...l(e, t),
|
|
110
151
|
cellClassName: "MuiInputBase-input"
|
|
111
152
|
};
|
|
112
153
|
}
|
|
113
154
|
};
|
|
114
|
-
function
|
|
155
|
+
function q(e, t) {
|
|
115
156
|
return e ? e.format === "date-time" ? "date-time" : e.isArray ? "multipleEnum" : e.type === "boolean" ? "boolean" : e.type === "number" || e.type === "integer" ? "number" : t && t.length > 0 ? "enumerated" : "text" : t && t.length > 0 ? "enumerated" : "text";
|
|
116
157
|
}
|
|
117
|
-
function
|
|
118
|
-
const t =
|
|
119
|
-
return
|
|
158
|
+
function U(e) {
|
|
159
|
+
const t = q(e.typeInfo, e.enumeratedValues);
|
|
160
|
+
return N[t](e);
|
|
120
161
|
}
|
|
121
162
|
export {
|
|
122
|
-
|
|
163
|
+
U as createColumn
|
|
123
164
|
};
|
|
124
165
|
//# sourceMappingURL=columnFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnFactory.js","sources":["../../../../src/components/DataGrid/utils/columnFactory.tsx"],"sourcesContent":["import { dateTimeColumn } from '@/components/DataGrid/columns/DateTimeColumn'\nimport { EnumeratedValue } from '@/utils/jsonschema/getEnumeratedValues'\nimport { FlatTypeInfo } from '@/utils/jsonschema/getType'\nimport {\n 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'\n\ntype ColumnConfig = {\n columnName: string\n description?: string\n disabled?: boolean\n typeInfo: FlatTypeInfo | null\n enumeratedValues: EnumeratedValue[] | string[] | null\n isRequired: boolean\n customWidth?: number\n showPinIcon?: boolean\n isPinned?: boolean\n onTogglePin?: () => void\n}\n\nfunction getHeaderClassName(isRequired: boolean): string {\n return isRequired ? 'header-cell-required' : 'header-cell'\n}\n\nfunction createDeleteValue(columnName: string, isRequired?: boolean) {\n return ({ rowData }: { rowData: Record<string, unknown> }) => ({\n ...rowData,\n [columnName]: isRequired ? null : undefined,\n })\n}\n\nfunction createParseUserInput(isRequired?: boolean) {\n return (value: string) => {\n const trimmedValue = value.trim()\n if (trimmedValue === '') {\n return isRequired ? null : undefined\n }\n return trimmedValue\n }\n}\n\nfunction createBaseColumn(config: ColumnConfig, columnImpl: any) {\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n undefined, // propertyInfo is not available here, passed from higher level\n headerOptions,\n )\n\n return {\n ...keyColumn(config.columnName, columnImpl),\n title: (\n <ColumnHeaderWithTooltip\n name={config.columnName}\n description={config.description}\n showPinIcon={config.showPinIcon}\n isPinned={config.isPinned}\n onTogglePin={config.onTogglePin}\n />\n ),\n headerClassName: getHeaderClassName(config.isRequired),\n minWidth: width,\n basis: width,\n grow: 0,\n shrink: 0,\n disabled: config.disabled,\n deleteValue: createDeleteValue(config.columnName, config.isRequired),\n stickyLeft: config.isPinned,\n }\n}\n\nconst COLUMN_FACTORIES = {\n multipleEnum: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteMultipleEnumColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n limitTags: 3,\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n boolean: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: [true, false],\n colType: 'boolean',\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n number: (config: ColumnConfig) => {\n return createBaseColumn(config, floatColumn)\n },\n\n enumerated: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n 'date-time': (config: ColumnConfig) => {\n const columnImpl = dateTimeColumn({\n colType: config.typeInfo?.type || null,\n })\n\n // Date-time needs special width calculation\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n {\n type: config.typeInfo ?? undefined,\n isRequired: config.isRequired,\n enumeratedValues: null,\n },\n headerOptions,\n )\n\n return {\n ...createBaseColumn(config, columnImpl),\n minWidth: width,\n basis: width,\n }\n },\n\n text: (config: ColumnConfig) => {\n const columnImpl = createTextColumn({\n continuousUpdates: false,\n deletedValue: undefined,\n parseUserInput: createParseUserInput(config.isRequired),\n })\n\n return {\n ...createBaseColumn(config, columnImpl),\n cellClassName: 'MuiInputBase-input',\n }\n },\n}\n\nfunction getColumnType(\n typeInfo: FlatTypeInfo | null,\n enumeratedValues?: EnumeratedValue[] | string[] | null,\n): keyof typeof COLUMN_FACTORIES {\n if (!typeInfo) {\n return enumeratedValues && enumeratedValues.length > 0\n ? 'enumerated'\n : 'text'\n }\n\n if (typeInfo.format === 'date-time') {\n return 'date-time'\n }\n\n // Handle arrays - check if it's an array of enums\n if (typeInfo.isArray) {\n return 'multipleEnum'\n }\n\n if (typeInfo.type === 'boolean') {\n return 'boolean'\n }\n\n if (typeInfo.type === 'number' || typeInfo.type === 'integer') {\n return 'number'\n }\n\n if (enumeratedValues && enumeratedValues.length > 0) {\n return 'enumerated'\n }\n\n return 'text'\n}\n\nexport function createColumn(config: ColumnConfig): Column {\n const columnType = getColumnType(config.typeInfo, config.enumeratedValues)\n return COLUMN_FACTORIES[columnType](config)\n}\n"],"names":["getHeaderClassName","isRequired","createDeleteValue","columnName","rowData","createParseUserInput","value","trimmedValue","createBaseColumn","config","columnImpl","headerOptions","width","calculateDefaultColumnWidth","keyColumn","jsx","ColumnHeaderWithTooltip","COLUMN_FACTORIES","autocompleteMultipleEnumColumn","autocompleteColumn","floatColumn","dateTimeColumn","createTextColumn","getColumnType","typeInfo","enumeratedValues","createColumn","columnType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"columnFactory.js","sources":["../../../../src/components/DataGrid/utils/columnFactory.tsx"],"sourcesContent":["import { dateTimeColumn } from '@/components/DataGrid/columns/DateTimeColumn'\nimport { EnumeratedValue } from '@/utils/jsonschema/getEnumeratedValues'\nimport { FlatTypeInfo } from '@/utils/jsonschema/getType'\nimport {\n CellComponent,\n CellProps,\n Column,\n createTextColumn,\n floatColumn,\n keyColumn,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { autocompleteColumn } from '../columns/AutocompleteColumn'\nimport { autocompleteMultipleEnumColumn } from '../columns/AutocompleteMultipleEnumColumn'\nimport {\n calculateDefaultColumnWidth,\n HeaderOptions,\n} from './calculateColumnWidth'\nimport { ColumnHeaderWithTooltip } from '../components/ColumnHeaderWithTooltip'\nimport { Tooltip } from '@mui/material'\nimport { SmartToyTwoTone } from '@mui/icons-material'\nimport type { DataGridRow } from '../DataGridTypes'\n\n/**\n * Wraps a column cell component to overlay change-attribution indicators:\n * - Non-agent changes: invisible 7×7px tooltip trigger over the CSS triangle (top-right).\n * - Agent changes: robot icon (1em, vertically centered on the right) with no triangle.\n */\nfunction withChangeIndicatorTooltip<T, C>(\n OriginalComponent: CellComponent<T, C>,\n colName: string,\n): CellComponent<T, C> {\n function CellWithTooltip(props: CellProps<T, C>) {\n const changeInfo = (props.rowData as DataGridRow).__cellChangeInfo?.[\n colName\n ]\n const isAgent =\n changeInfo?.category === 'own-agent' ||\n changeInfo?.category === 'other-agent'\n return (\n <>\n <OriginalComponent {...props} />\n {changeInfo && !isAgent && (\n <Tooltip title={changeInfo.tooltipText} placement=\"top-end\">\n <div\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: 7,\n height: 7,\n zIndex: 21,\n pointerEvents: 'auto',\n }}\n />\n </Tooltip>\n )}\n {isAgent && !props.focus && (\n <Tooltip title={changeInfo.tooltipText} placement=\"left\">\n <SmartToyTwoTone\n sx={{\n fontSize: '1em',\n alignSelf: 'center',\n flexShrink: 0,\n mr: 0.5,\n zIndex: 21,\n pointerEvents: 'auto',\n color: 'grey.400',\n backgroundColor: 'transparent',\n }}\n />\n </Tooltip>\n )}\n </>\n )\n }\n CellWithTooltip.displayName = `CellWithTooltip(${colName})`\n return CellWithTooltip\n}\n\ntype ColumnConfig = {\n columnName: string\n description?: string\n disabled?: boolean\n typeInfo: FlatTypeInfo | null\n enumeratedValues: EnumeratedValue[] | string[] | null\n isRequired: boolean\n customWidth?: number\n showPinIcon?: boolean\n isPinned?: boolean\n onTogglePin?: () => void\n}\n\nfunction getHeaderClassName(isRequired: boolean): string {\n return isRequired ? 'header-cell-required' : 'header-cell'\n}\n\nfunction createDeleteValue(columnName: string, isRequired?: boolean) {\n return ({ rowData }: { rowData: Record<string, unknown> }) => ({\n ...rowData,\n [columnName]: isRequired ? null : undefined,\n })\n}\n\nfunction createParseUserInput(isRequired?: boolean) {\n return (value: string) => {\n const trimmedValue = value.trim()\n if (trimmedValue === '') {\n return isRequired ? null : undefined\n }\n return trimmedValue\n }\n}\n\nfunction createBaseColumn(config: ColumnConfig, columnImpl: any) {\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n undefined, // propertyInfo is not available here, passed from higher level\n headerOptions,\n )\n\n const keyed = keyColumn(config.columnName, columnImpl)\n return {\n ...keyed,\n component: withChangeIndicatorTooltip(keyed.component!, config.columnName),\n title: (\n <ColumnHeaderWithTooltip\n name={config.columnName}\n description={config.description}\n showPinIcon={config.showPinIcon}\n isPinned={config.isPinned}\n onTogglePin={config.onTogglePin}\n />\n ),\n headerClassName: getHeaderClassName(config.isRequired),\n minWidth: width,\n basis: width,\n grow: 0,\n shrink: 0,\n disabled: config.disabled,\n deleteValue: createDeleteValue(config.columnName, config.isRequired),\n stickyLeft: config.isPinned,\n }\n}\n\nconst COLUMN_FACTORIES = {\n multipleEnum: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteMultipleEnumColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n limitTags: 3,\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n boolean: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: [true, false],\n colType: 'boolean',\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n number: (config: ColumnConfig) => {\n return createBaseColumn(config, floatColumn)\n },\n\n enumerated: (config: ColumnConfig) => {\n return createBaseColumn(\n config,\n autocompleteColumn({\n choices: config.enumeratedValues ?? [],\n colType: config.typeInfo?.type || null,\n clearValue: config.isRequired ? null : undefined,\n }),\n )\n },\n\n 'date-time': (config: ColumnConfig) => {\n const columnImpl = dateTimeColumn({\n colType: config.typeInfo?.type || null,\n })\n\n // Date-time needs special width calculation\n const headerOptions: HeaderOptions = {\n showPinIcon: config.showPinIcon,\n hasDescription: !!config.description,\n }\n\n const width =\n config.customWidth ??\n calculateDefaultColumnWidth(\n config.columnName,\n {\n type: config.typeInfo ?? undefined,\n isRequired: config.isRequired,\n enumeratedValues: null,\n },\n headerOptions,\n )\n\n return {\n ...createBaseColumn(config, columnImpl),\n minWidth: width,\n basis: width,\n }\n },\n\n text: (config: ColumnConfig) => {\n const columnImpl = createTextColumn({\n continuousUpdates: false,\n deletedValue: undefined,\n parseUserInput: createParseUserInput(config.isRequired),\n })\n\n return {\n ...createBaseColumn(config, columnImpl),\n cellClassName: 'MuiInputBase-input',\n }\n },\n}\n\nfunction getColumnType(\n typeInfo: FlatTypeInfo | null,\n enumeratedValues?: EnumeratedValue[] | string[] | null,\n): keyof typeof COLUMN_FACTORIES {\n if (!typeInfo) {\n return enumeratedValues && enumeratedValues.length > 0\n ? 'enumerated'\n : 'text'\n }\n\n if (typeInfo.format === 'date-time') {\n return 'date-time'\n }\n\n // Handle arrays - check if it's an array of enums\n if (typeInfo.isArray) {\n return 'multipleEnum'\n }\n\n if (typeInfo.type === 'boolean') {\n return 'boolean'\n }\n\n if (typeInfo.type === 'number' || typeInfo.type === 'integer') {\n return 'number'\n }\n\n if (enumeratedValues && enumeratedValues.length > 0) {\n return 'enumerated'\n }\n\n return 'text'\n}\n\nexport function createColumn(config: ColumnConfig): Column {\n const columnType = getColumnType(config.typeInfo, config.enumeratedValues)\n return COLUMN_FACTORIES[columnType](config)\n}\n"],"names":["withChangeIndicatorTooltip","OriginalComponent","colName","CellWithTooltip","props","changeInfo","isAgent","jsxs","Fragment","jsx","Tooltip","SmartToyTwoTone","getHeaderClassName","isRequired","createDeleteValue","columnName","rowData","createParseUserInput","value","trimmedValue","createBaseColumn","config","columnImpl","headerOptions","width","calculateDefaultColumnWidth","keyed","keyColumn","ColumnHeaderWithTooltip","COLUMN_FACTORIES","autocompleteMultipleEnumColumn","autocompleteColumn","floatColumn","dateTimeColumn","createTextColumn","getColumnType","typeInfo","enumeratedValues","createColumn","columnType"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DataGridRow, GridModel, GridModelSnapshot } from '../DataGridTypes';
|
|
2
|
+
import type { ReplicaUserInfo } from '../hooks/useGridReplicaUsers';
|
|
3
|
+
/**
|
|
4
|
+
* Enriches each row in `rows` with a `__cellChangeInfo` map that records the
|
|
5
|
+
* change category and tooltip text for every cell whose last author is present
|
|
6
|
+
* in `replicaUserMap`.
|
|
7
|
+
*
|
|
8
|
+
* Short-circuits (returning the original array reference) when the model or
|
|
9
|
+
* snapshot is absent, or when no replica attribution data is available yet.
|
|
10
|
+
* Rows with no attributed cells are returned by reference to preserve React
|
|
11
|
+
* referential equality.
|
|
12
|
+
*/
|
|
13
|
+
export declare function enrichRowsWithChangeInfo(rows: DataGridRow[], model: GridModel | null, modelSnapshot: GridModelSnapshot | null, replicaUserMap: ReadonlyMap<number, ReplicaUserInfo>): DataGridRow[];
|
|
14
|
+
//# sourceMappingURL=enrichRowsWithChangeInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichRowsWithChangeInfo.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/enrichRowsWithChangeInfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,SAAS,EACT,iBAAiB,EAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAInE;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,WAAW,EAAE,EACnB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,aAAa,EAAE,iBAAiB,GAAG,IAAI,EACvC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,GACnD,WAAW,EAAE,CA4Bf"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getCellAuthorSid as s } from "./getCellAuthorSid.js";
|
|
2
|
+
import { getChangeTooltipText as a } from "./getChangeTooltipText.js";
|
|
3
|
+
function T(e, o, r, c) {
|
|
4
|
+
if (!o || !r || c.size === 0) return e;
|
|
5
|
+
const { columnNames: l, columnOrder: h } = r;
|
|
6
|
+
return e.map((i, m) => {
|
|
7
|
+
const t = {};
|
|
8
|
+
return h.forEach((f) => {
|
|
9
|
+
const u = l[f];
|
|
10
|
+
if (!u) return;
|
|
11
|
+
const g = s(o, m, f);
|
|
12
|
+
if (g === null) return;
|
|
13
|
+
const n = c.get(g);
|
|
14
|
+
n && (t[u] = {
|
|
15
|
+
category: n.category,
|
|
16
|
+
tooltipText: a(n)
|
|
17
|
+
});
|
|
18
|
+
}), Object.keys(t).length > 0 ? { ...i, __cellChangeInfo: t } : i;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
T as enrichRowsWithChangeInfo
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=enrichRowsWithChangeInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrichRowsWithChangeInfo.js","sources":["../../../../src/components/DataGrid/utils/enrichRowsWithChangeInfo.ts"],"sourcesContent":["import type {\n CellChangeInfo,\n DataGridRow,\n GridModel,\n GridModelSnapshot,\n} from '../DataGridTypes'\nimport type { ReplicaUserInfo } from '../hooks/useGridReplicaUsers'\nimport { getCellAuthorSid } from './getCellAuthorSid'\nimport { getChangeTooltipText } from './getChangeTooltipText'\n\n/**\n * Enriches each row in `rows` with a `__cellChangeInfo` map that records the\n * change category and tooltip text for every cell whose last author is present\n * in `replicaUserMap`.\n *\n * Short-circuits (returning the original array reference) when the model or\n * snapshot is absent, or when no replica attribution data is available yet.\n * Rows with no attributed cells are returned by reference to preserve React\n * referential equality.\n */\nexport function enrichRowsWithChangeInfo(\n rows: DataGridRow[],\n model: GridModel | null,\n modelSnapshot: GridModelSnapshot | null,\n replicaUserMap: ReadonlyMap<number, ReplicaUserInfo>,\n): DataGridRow[] {\n if (!model || !modelSnapshot || replicaUserMap.size === 0) return rows\n\n const { columnNames, columnOrder } = modelSnapshot\n\n return rows.map((row, rowIndex) => {\n const cellChangeInfo: Record<string, CellChangeInfo> = {}\n\n columnOrder.forEach((colArrayIndex: number) => {\n const columnName = columnNames[colArrayIndex]\n if (!columnName) return\n\n const sid = getCellAuthorSid(model, rowIndex, colArrayIndex)\n if (sid === null) return\n\n const info = replicaUserMap.get(sid)\n if (!info) return\n\n cellChangeInfo[columnName] = {\n category: info.category,\n tooltipText: getChangeTooltipText(info),\n }\n })\n\n return Object.keys(cellChangeInfo).length > 0\n ? { ...row, __cellChangeInfo: cellChangeInfo }\n : row\n })\n}\n"],"names":["enrichRowsWithChangeInfo","rows","model","modelSnapshot","replicaUserMap","columnNames","columnOrder","row","rowIndex","cellChangeInfo","colArrayIndex","columnName","sid","getCellAuthorSid","info","getChangeTooltipText"],"mappings":";;AAoBO,SAASA,EACdC,GACAC,GACAC,GACAC,GACe;AACf,MAAI,CAACF,KAAS,CAACC,KAAiBC,EAAe,SAAS,EAAG,QAAOH;AAElE,QAAM,EAAE,aAAAI,GAAa,aAAAC,EAAA,IAAgBH;AAErC,SAAOF,EAAK,IAAI,CAACM,GAAKC,MAAa;AACjC,UAAMC,IAAiD,CAAA;AAEvD,WAAAH,EAAY,QAAQ,CAACI,MAA0B;AAC7C,YAAMC,IAAaN,EAAYK,CAAa;AAC5C,UAAI,CAACC,EAAY;AAEjB,YAAMC,IAAMC,EAAiBX,GAAOM,GAAUE,CAAa;AAC3D,UAAIE,MAAQ,KAAM;AAElB,YAAME,IAAOV,EAAe,IAAIQ,CAAG;AACnC,MAAKE,MAELL,EAAeE,CAAU,IAAI;AAAA,QAC3B,UAAUG,EAAK;AAAA,QACf,aAAaC,EAAqBD,CAAI;AAAA,MAAA;AAAA,IAE1C,CAAC,GAEM,OAAO,KAAKL,CAAc,EAAE,SAAS,IACxC,EAAE,GAAGF,GAAK,kBAAkBE,EAAA,IAC5BF;AAAA,EACN,CAAC;AACH;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GridModel } from '@/components/DataGrid/DataGridTypes';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the sid (replica ID) of the last writer for a given cell in the CRDT
|
|
4
|
+
* model, or null if the cell is unreachable (e.g. out-of-bounds row/column).
|
|
5
|
+
*/
|
|
6
|
+
export declare function getCellAuthorSid(model: GridModel, rowIndex: number, colIndex: number): number | null;
|
|
7
|
+
//# sourceMappingURL=getCellAuthorSid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCellAuthorSid.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/getCellAuthorSid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAEpE;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAOf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCellAuthorSid.js","sources":["../../../../src/components/DataGrid/utils/getCellAuthorSid.ts"],"sourcesContent":["import type { GridModel } from '@/components/DataGrid/DataGridTypes'\n\n/**\n * Returns the sid (replica ID) of the last writer for a given cell in the CRDT\n * model, or null if the cell is unreachable (e.g. out-of-bounds row/column).\n */\nexport function getCellAuthorSid(\n model: GridModel,\n rowIndex: number,\n colIndex: number,\n): number | null {\n try {\n return model.api.vec(['rows', String(rowIndex), 'data']).get(colIndex).node\n .id.sid\n } catch {\n return null\n }\n}\n"],"names":["getCellAuthorSid","model","rowIndex","colIndex"],"mappings":"AAMO,SAASA,EACdC,GACAC,GACAC,GACe;AACf,MAAI;AACF,WAAOF,EAAM,IAAI,IAAI,CAAC,QAAQ,OAAOC,CAAQ,GAAG,MAAM,CAAC,EAAE,IAAIC,CAAQ,EAAE,KACpE,GAAG;AAAA,EACR,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DataGridRow } from '../DataGridTypes';
|
|
2
2
|
import { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid';
|
|
3
3
|
import { Column } from '@sage-bionetworks/react-datasheet-grid';
|
|
4
|
+
import type { RemoteSelection } from '../hooks/useRemoteSelections';
|
|
4
5
|
export declare function getCellClassName(params: {
|
|
5
6
|
rowData: DataGridRow;
|
|
6
7
|
rowIndex: number;
|
|
@@ -8,5 +9,6 @@ export declare function getCellClassName(params: {
|
|
|
8
9
|
selectedRowIndex: number | null;
|
|
9
10
|
lastSelection?: SelectionWithId | null;
|
|
10
11
|
colValues?: Column[];
|
|
12
|
+
remoteSelections?: readonly RemoteSelection[];
|
|
11
13
|
}): string | undefined;
|
|
12
14
|
//# sourceMappingURL=getCellClassName.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCellClassName.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/getCellClassName.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAA;
|
|
1
|
+
{"version":3,"file":"getCellClassName.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/getCellClassName.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAEnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,OAAO,EAAE,WAAW,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,aAAa,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC9C,GAAG,MAAM,GAAG,SAAS,CA+DrB"}
|
|
@@ -1,18 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
function
|
|
1
|
+
import w from "classnames";
|
|
2
|
+
function v(f) {
|
|
3
3
|
const {
|
|
4
|
-
rowData:
|
|
5
|
-
rowIndex:
|
|
4
|
+
rowData: t,
|
|
5
|
+
rowIndex: n,
|
|
6
6
|
columnId: e,
|
|
7
|
-
selectedRowIndex:
|
|
8
|
-
lastSelection:
|
|
9
|
-
colValues:
|
|
10
|
-
|
|
11
|
-
f &&
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
selectedRowIndex: u,
|
|
8
|
+
lastSelection: s,
|
|
9
|
+
colValues: c,
|
|
10
|
+
remoteSelections: i
|
|
11
|
+
} = f, h = u === n, a = t.__cellValidationResults, I = a && e && a.has(e), l = [];
|
|
12
|
+
h && l.push("cell-row-selected");
|
|
13
|
+
let d = !1;
|
|
14
|
+
s && e && c && (d = n >= s.min.row && n <= s.max.row && c.findIndex((o) => o.id === e) >= s.min.col && c.findIndex((o) => o.id === e) <= s.max.col, d && l.push("cell-selected")), I && l.push("cell-invalid");
|
|
15
|
+
const r = e ? t.__cellChangeInfo?.[e] : void 0;
|
|
16
|
+
if (r && l.push(`cell-changed--${r.category}`), i && e)
|
|
17
|
+
for (const o of i) {
|
|
18
|
+
const { minRow: x, maxRow: p, columnNames: m } = o.range;
|
|
19
|
+
if (!(n < x || n > p) && !(m !== void 0 && !m.has(e))) {
|
|
20
|
+
l.push("cell-remote-selected"), l.push(`cell-remote-selected--color-${o.colorIndex}`);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return l.length ? w(l) : void 0;
|
|
14
25
|
}
|
|
15
26
|
export {
|
|
16
|
-
|
|
27
|
+
v as getCellClassName
|
|
17
28
|
};
|
|
18
29
|
//# sourceMappingURL=getCellClassName.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCellClassName.js","sources":["../../../../src/components/DataGrid/utils/getCellClassName.ts"],"sourcesContent":["import classNames from 'classnames'\nimport { DataGridRow } from '../DataGridTypes'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport { Column } from '@sage-bionetworks/react-datasheet-grid'\n\nexport function getCellClassName(params: {\n rowData: DataGridRow\n rowIndex: number\n columnId?: string\n selectedRowIndex: number | null\n lastSelection?: SelectionWithId | null\n colValues?: Column[]\n}): string | undefined {\n const {\n rowData,\n rowIndex,\n columnId,\n selectedRowIndex,\n lastSelection,\n colValues,\n } = params\n\n const isSelected = selectedRowIndex === rowIndex\n const cellValidationResults = rowData.__cellValidationResults\n const isInvalid =\n cellValidationResults && columnId && cellValidationResults.has(columnId)\n\n const classList: string[] = []\n\n if (isSelected) {\n classList.push('cell-row-selected')\n }\n\n // Add selection styling based on lastSelection\n let isInSelection = false\n if (lastSelection && columnId && colValues) {\n isInSelection =\n rowIndex >= lastSelection.min.row &&\n rowIndex <= lastSelection.max.row &&\n colValues.findIndex(col => col.id === columnId) >=\n lastSelection.min.col &&\n colValues.findIndex(col => col.id === columnId) <= lastSelection.max.col\n\n if (isInSelection) {\n classList.push('cell-selected')\n }\n }\n\n if (isInvalid) {\n classList.push('cell-invalid')\n }\n\n return classList.length ? classNames(classList) : undefined\n}\n"],"names":["getCellClassName","params","rowData","rowIndex","columnId","selectedRowIndex","lastSelection","colValues","isSelected","cellValidationResults","isInvalid","classList","isInSelection","col","classNames"],"mappings":";
|
|
1
|
+
{"version":3,"file":"getCellClassName.js","sources":["../../../../src/components/DataGrid/utils/getCellClassName.ts"],"sourcesContent":["import classNames from 'classnames'\nimport { DataGridRow } from '../DataGridTypes'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport { Column } from '@sage-bionetworks/react-datasheet-grid'\nimport type { RemoteSelection } from '../hooks/useRemoteSelections'\n\nexport function getCellClassName(params: {\n rowData: DataGridRow\n rowIndex: number\n columnId?: string\n selectedRowIndex: number | null\n lastSelection?: SelectionWithId | null\n colValues?: Column[]\n remoteSelections?: readonly RemoteSelection[]\n}): string | undefined {\n const {\n rowData,\n rowIndex,\n columnId,\n selectedRowIndex,\n lastSelection,\n colValues,\n remoteSelections,\n } = params\n\n const isSelected = selectedRowIndex === rowIndex\n const cellValidationResults = rowData.__cellValidationResults\n const isInvalid =\n cellValidationResults && columnId && cellValidationResults.has(columnId)\n\n const classList: string[] = []\n\n if (isSelected) {\n classList.push('cell-row-selected')\n }\n\n // Add selection styling based on lastSelection\n let isInSelection = false\n if (lastSelection && columnId && colValues) {\n isInSelection =\n rowIndex >= lastSelection.min.row &&\n rowIndex <= lastSelection.max.row &&\n colValues.findIndex(col => col.id === columnId) >=\n lastSelection.min.col &&\n colValues.findIndex(col => col.id === columnId) <= lastSelection.max.col\n\n if (isInSelection) {\n classList.push('cell-selected')\n }\n }\n\n if (isInvalid) {\n classList.push('cell-invalid')\n }\n\n // ── Cell change indicator ─────────────────────────────────────────────────\n const cellChangeInfo = columnId\n ? rowData.__cellChangeInfo?.[columnId]\n : undefined\n if (cellChangeInfo) {\n classList.push(`cell-changed--${cellChangeInfo.category}`)\n }\n\n // ── Remote selection tint ─────────────────────────────────────────────────\n if (remoteSelections && columnId) {\n for (const remote of remoteSelections) {\n const { minRow, maxRow, columnNames: remoteColumnNames } = remote.range\n if (rowIndex < minRow || rowIndex > maxRow) continue\n if (remoteColumnNames !== undefined && !remoteColumnNames.has(columnId))\n continue\n classList.push('cell-remote-selected')\n classList.push(`cell-remote-selected--color-${remote.colorIndex}`)\n break // apply the first matching remote selection only\n }\n }\n\n return classList.length ? classNames(classList) : undefined\n}\n"],"names":["getCellClassName","params","rowData","rowIndex","columnId","selectedRowIndex","lastSelection","colValues","remoteSelections","isSelected","cellValidationResults","isInvalid","classList","isInSelection","col","cellChangeInfo","remote","minRow","maxRow","remoteColumnNames","classNames"],"mappings":";AAMO,SAASA,EAAiBC,GAQV;AACrB,QAAM;AAAA,IACJ,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,WAAAC;AAAA,IACA,kBAAAC;AAAA,EAAA,IACEP,GAEEQ,IAAaJ,MAAqBF,GAClCO,IAAwBR,EAAQ,yBAChCS,IACJD,KAAyBN,KAAYM,EAAsB,IAAIN,CAAQ,GAEnEQ,IAAsB,CAAA;AAE5B,EAAIH,KACFG,EAAU,KAAK,mBAAmB;AAIpC,MAAIC,IAAgB;AACpB,EAAIP,KAAiBF,KAAYG,MAC/BM,IACEV,KAAYG,EAAc,IAAI,OAC9BH,KAAYG,EAAc,IAAI,OAC9BC,EAAU,UAAU,CAAAO,MAAOA,EAAI,OAAOV,CAAQ,KAC5CE,EAAc,IAAI,OACpBC,EAAU,UAAU,CAAAO,MAAOA,EAAI,OAAOV,CAAQ,KAAKE,EAAc,IAAI,KAEnEO,KACFD,EAAU,KAAK,eAAe,IAI9BD,KACFC,EAAU,KAAK,cAAc;AAI/B,QAAMG,IAAiBX,IACnBF,EAAQ,mBAAmBE,CAAQ,IACnC;AAMJ,MALIW,KACFH,EAAU,KAAK,iBAAiBG,EAAe,QAAQ,EAAE,GAIvDP,KAAoBJ;AACtB,eAAWY,KAAUR,GAAkB;AACrC,YAAM,EAAE,QAAAS,GAAQ,QAAAC,GAAQ,aAAaC,EAAA,IAAsBH,EAAO;AAClE,UAAI,EAAAb,IAAWc,KAAUd,IAAWe,MAChC,EAAAC,MAAsB,UAAa,CAACA,EAAkB,IAAIf,CAAQ,IAEtE;AAAA,QAAAQ,EAAU,KAAK,sBAAsB,GACrCA,EAAU,KAAK,+BAA+BI,EAAO,UAAU,EAAE;AACjE;AAAA;AAAA,IACF;AAGF,SAAOJ,EAAU,SAASQ,EAAWR,CAAS,IAAI;AACpD;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReplicaUserInfo } from '../hooks/useGridReplicaUsers';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a human-readable tooltip string describing who last changed a cell,
|
|
4
|
+
* based on the replica's category and (if available) the user's profile.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getChangeTooltipText(info: ReplicaUserInfo): string;
|
|
7
|
+
//# sourceMappingURL=getChangeTooltipText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getChangeTooltipText.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/getChangeTooltipText.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAEnE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAmBlE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function a(t) {
|
|
2
|
+
switch (t.category) {
|
|
3
|
+
case "self":
|
|
4
|
+
return "You changed this";
|
|
5
|
+
case "own-agent":
|
|
6
|
+
return "Changed by your agent";
|
|
7
|
+
case "other-agent":
|
|
8
|
+
return "Changed by an agent";
|
|
9
|
+
case "other-user": {
|
|
10
|
+
const { profile: e } = t;
|
|
11
|
+
return e ? `Changed by ${[e.firstName, e.lastName].filter(Boolean).join(" ").trim() || e.userName}` : "Changed by another user";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
a as getChangeTooltipText
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=getChangeTooltipText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getChangeTooltipText.js","sources":["../../../../src/components/DataGrid/utils/getChangeTooltipText.ts"],"sourcesContent":["import type { ReplicaUserInfo } from '../hooks/useGridReplicaUsers'\n\n/**\n * Returns a human-readable tooltip string describing who last changed a cell,\n * based on the replica's category and (if available) the user's profile.\n */\nexport function getChangeTooltipText(info: ReplicaUserInfo): string {\n switch (info.category) {\n case 'self':\n return 'You changed this'\n case 'own-agent':\n return 'Changed by your agent'\n case 'other-agent':\n return 'Changed by an agent'\n case 'other-user': {\n const { profile } = info\n if (!profile) return 'Changed by another user'\n const name =\n [profile.firstName, profile.lastName]\n .filter(Boolean)\n .join(' ')\n .trim() || profile.userName\n return `Changed by ${name}`\n }\n }\n}\n"],"names":["getChangeTooltipText","info","profile"],"mappings":"AAMO,SAASA,EAAqBC,GAA+B;AAClE,UAAQA,EAAK,UAAA;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK,cAAc;AACjB,YAAM,EAAE,SAAAC,MAAYD;AACpB,aAAKC,IAME,cAJL,CAACA,EAAQ,WAAWA,EAAQ,QAAQ,EACjC,OAAO,OAAO,EACd,KAAK,GAAG,EACR,KAAA,KAAUA,EAAQ,QACE,KANJ;AAAA,IAOvB;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GridReplicaInfo } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
/**
|
|
3
|
+
* Categories used for attributing cell changes and coloring indicators.
|
|
4
|
+
* SERVICE replica changes are excluded entirely.
|
|
5
|
+
*/
|
|
6
|
+
export type ReplicaCategory = 'self' | 'own-agent' | 'other-user' | 'other-agent';
|
|
7
|
+
/**
|
|
8
|
+
* Classify a replica relative to the current user.
|
|
9
|
+
* Returns null for SERVICE replicas, which should be ignored for attribution.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getReplicaCategory(replica: GridReplicaInfo, currentUserId: string, localReplicaId: number): ReplicaCategory | null;
|
|
12
|
+
//# sourceMappingURL=getReplicaCategory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getReplicaCategory.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/getReplicaCategory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAEvE;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,WAAW,GACX,YAAY,GACZ,aAAa,CAAA;AAEjB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,eAAe,GAAG,IAAI,CAmBxB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function c(t, n, i) {
|
|
2
|
+
const { replicaType: e, createdBy: o, replicaId: a } = t;
|
|
3
|
+
if (e === "SERVICE")
|
|
4
|
+
return null;
|
|
5
|
+
if (a === i)
|
|
6
|
+
return "self";
|
|
7
|
+
const r = o === n;
|
|
8
|
+
return e === "AGENT" ? r ? "own-agent" : "other-agent" : r ? "self" : "other-user";
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
c as getReplicaCategory
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=getReplicaCategory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getReplicaCategory.js","sources":["../../../../src/components/DataGrid/utils/getReplicaCategory.ts"],"sourcesContent":["import type { GridReplicaInfo } from '@sage-bionetworks/synapse-client'\n\n/**\n * Categories used for attributing cell changes and coloring indicators.\n * SERVICE replica changes are excluded entirely.\n */\nexport type ReplicaCategory =\n | 'self' // this client's own replica\n | 'own-agent' // an AGENT replica created by this user\n | 'other-user' // a USER replica created by another user\n | 'other-agent' // an AGENT replica created by another user\n\n/**\n * Classify a replica relative to the current user.\n * Returns null for SERVICE replicas, which should be ignored for attribution.\n */\nexport function getReplicaCategory(\n replica: GridReplicaInfo,\n currentUserId: string,\n localReplicaId: number,\n): ReplicaCategory | null {\n const { replicaType, createdBy, replicaId } = replica\n\n if (replicaType === 'SERVICE') {\n return null\n }\n\n if (replicaId === localReplicaId) {\n return 'self'\n }\n\n const isOwnUser = createdBy === currentUserId\n\n if (replicaType === 'AGENT') {\n return isOwnUser ? 'own-agent' : 'other-agent'\n }\n\n // USER\n return isOwnUser ? 'self' : 'other-user'\n}\n"],"names":["getReplicaCategory","replica","currentUserId","localReplicaId","replicaType","createdBy","replicaId","isOwnUser"],"mappings":"AAgBO,SAASA,EACdC,GACAC,GACAC,GACwB;AACxB,QAAM,EAAE,aAAAC,GAAa,WAAAC,GAAW,WAAAC,EAAA,IAAcL;AAE9C,MAAIG,MAAgB;AAClB,WAAO;AAGT,MAAIE,MAAcH;AAChB,WAAO;AAGT,QAAMI,IAAYF,MAAcH;AAEhC,SAAIE,MAAgB,UACXG,IAAY,cAAc,gBAI5BA,IAAY,SAAS;AAC9B;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GridModel, ReplicaSelectionModel } from '../DataGridTypes';
|
|
2
|
+
export interface GridSelectionRange {
|
|
3
|
+
minRow: number;
|
|
4
|
+
maxRow: number;
|
|
5
|
+
/** undefined means all columns are selected */
|
|
6
|
+
columnNames: Set<string> | undefined;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Converts a stored ReplicaSelectionModel (CRDT-stable IDs) back into a
|
|
10
|
+
* plain grid selection range that can be used for cell class computation.
|
|
11
|
+
*
|
|
12
|
+
* This is the inverse of getCrdtIdsForArrayRange in computeReplicaSelectionModel.
|
|
13
|
+
*/
|
|
14
|
+
export declare function replicaSelectionToGridSelection(selection: ReplicaSelectionModel | null | undefined, model: GridModel): GridSelectionRange | null;
|
|
15
|
+
//# sourceMappingURL=replicaSelectionToGridSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replicaSelectionToGridSelection.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/replicaSelectionToGridSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAU,MAAM,kBAAkB,CAAA;AAEhF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;CACrC;AA4BD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,EACnD,KAAK,EAAE,SAAS,GACf,kBAAkB,GAAG,IAAI,CAwC3B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function d(t, u) {
|
|
2
|
+
const e = /* @__PURE__ */ new Set();
|
|
3
|
+
if (u.length === 0) return e;
|
|
4
|
+
const i = new Set(u.map((n) => `${n.rep}:${n.seq}`));
|
|
5
|
+
let s = 0;
|
|
6
|
+
for (const n of t.node.chunks())
|
|
7
|
+
if (!n.del) {
|
|
8
|
+
for (let o = 0; o < n.span; o++) {
|
|
9
|
+
const a = `${n.id.sid}:${n.id.time + o}`;
|
|
10
|
+
i.has(a) && e.add(s + o);
|
|
11
|
+
}
|
|
12
|
+
s += n.span;
|
|
13
|
+
}
|
|
14
|
+
return e;
|
|
15
|
+
}
|
|
16
|
+
function m(t, u) {
|
|
17
|
+
if (!t) return null;
|
|
18
|
+
const e = u.api.getSnapshot(), i = e.rows.length, s = e.columnNames.length;
|
|
19
|
+
if (i < 1 || s < 1) return null;
|
|
20
|
+
let n = 0, o = i - 1;
|
|
21
|
+
if (!t.rowSelectAll) {
|
|
22
|
+
const r = t.rowSelection;
|
|
23
|
+
if (!r || r.length === 0) return null;
|
|
24
|
+
const c = d(u.api.arr(["rows"]), r);
|
|
25
|
+
if (c.size === 0) return null;
|
|
26
|
+
n = [...c].reduce((l, f) => Math.min(l, f)), o = [...c].reduce((l, f) => Math.max(l, f));
|
|
27
|
+
}
|
|
28
|
+
let a;
|
|
29
|
+
if (!t.columnSelectAll) {
|
|
30
|
+
const r = t.columnSelection;
|
|
31
|
+
if (!r || r.length === 0) return null;
|
|
32
|
+
const c = d(u.api.arr(["columnOrder"]), r);
|
|
33
|
+
if (c.size === 0) return null;
|
|
34
|
+
a = new Set(
|
|
35
|
+
[...c].map((l) => e.columnNames[e.columnOrder[l]]).filter((l) => l !== void 0)
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return { minRow: n, maxRow: o, columnNames: a };
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
m as replicaSelectionToGridSelection
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=replicaSelectionToGridSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replicaSelectionToGridSelection.js","sources":["../../../../src/components/DataGrid/utils/replicaSelectionToGridSelection.ts"],"sourcesContent":["import type { GridModel, ReplicaSelectionModel, CrdtId } from '../DataGridTypes'\n\nexport interface GridSelectionRange {\n minRow: number\n maxRow: number\n /** undefined means all columns are selected */\n columnNames: Set<string> | undefined\n}\n\n/**\n * Convert a flat array of CrdtIds to a Set of array indices by walking the\n * arr node's chunks.\n */\nfunction crdtIdsToIndices(\n arrApi: ReturnType<GridModel['api']['arr']>,\n ids: CrdtId[],\n): Set<number> {\n const result = new Set<number>()\n if (ids.length === 0) return result\n\n // Build a lookup set for O(1) membership test\n const lookup = new Set(ids.map(id => `${id.rep}:${id.seq}`))\n\n let idx = 0\n for (const chunk of arrApi.node.chunks()) {\n if (chunk.del) continue\n for (let offset = 0; offset < chunk.span; offset++) {\n const key = `${chunk.id.sid}:${chunk.id.time + offset}`\n if (lookup.has(key)) result.add(idx + offset)\n }\n idx += chunk.span\n }\n return result\n}\n\n/**\n * Converts a stored ReplicaSelectionModel (CRDT-stable IDs) back into a\n * plain grid selection range that can be used for cell class computation.\n *\n * This is the inverse of getCrdtIdsForArrayRange in computeReplicaSelectionModel.\n */\nexport function replicaSelectionToGridSelection(\n selection: ReplicaSelectionModel | null | undefined,\n model: GridModel,\n): GridSelectionRange | null {\n if (!selection) return null\n\n const snapshot = model.api.getSnapshot()\n const numRows = snapshot.rows.length\n const numCols = snapshot.columnNames.length\n\n if (numRows < 1 || numCols < 1) return null\n\n // ── Row range ────────────────────────────────────────────────────────────\n let minRow = 0\n let maxRow = numRows - 1\n\n if (!selection.rowSelectAll) {\n const rowIds = selection.rowSelection\n if (!rowIds || rowIds.length === 0) return null\n\n const rowIndexSet = crdtIdsToIndices(model.api.arr(['rows']), rowIds)\n if (rowIndexSet.size === 0) return null\n minRow = [...rowIndexSet].reduce((a, b) => Math.min(a, b))\n maxRow = [...rowIndexSet].reduce((a, b) => Math.max(a, b))\n }\n\n // ── Column range ─────────────────────────────────────────────────────────\n let columnNames: Set<string> | undefined = undefined // undefined = all columns\n\n if (!selection.columnSelectAll) {\n const colIds = selection.columnSelection\n if (!colIds || colIds.length === 0) return null\n\n const colIndexSet = crdtIdsToIndices(model.api.arr(['columnOrder']), colIds)\n if (colIndexSet.size === 0) return null\n columnNames = new Set(\n [...colIndexSet]\n .map(colIdx => snapshot.columnNames[snapshot.columnOrder[colIdx]])\n .filter((name): name is string => name !== undefined),\n )\n }\n\n return { minRow, maxRow, columnNames }\n}\n"],"names":["crdtIdsToIndices","arrApi","ids","result","lookup","id","idx","chunk","offset","key","replicaSelectionToGridSelection","selection","model","snapshot","numRows","numCols","minRow","maxRow","rowIds","rowIndexSet","a","b","columnNames","colIds","colIndexSet","colIdx","name"],"mappings":"AAaA,SAASA,EACPC,GACAC,GACa;AACb,QAAMC,wBAAa,IAAA;AACnB,MAAID,EAAI,WAAW,EAAG,QAAOC;AAG7B,QAAMC,IAAS,IAAI,IAAIF,EAAI,IAAI,CAAAG,MAAM,GAAGA,EAAG,GAAG,IAAIA,EAAG,GAAG,EAAE,CAAC;AAE3D,MAAIC,IAAM;AACV,aAAWC,KAASN,EAAO,KAAK,OAAA;AAC9B,QAAI,CAAAM,EAAM,KACV;AAAA,eAASC,IAAS,GAAGA,IAASD,EAAM,MAAMC,KAAU;AAClD,cAAMC,IAAM,GAAGF,EAAM,GAAG,GAAG,IAAIA,EAAM,GAAG,OAAOC,CAAM;AACrD,QAAIJ,EAAO,IAAIK,CAAG,KAAGN,EAAO,IAAIG,IAAME,CAAM;AAAA,MAC9C;AACA,MAAAF,KAAOC,EAAM;AAAA;AAEf,SAAOJ;AACT;AAQO,SAASO,EACdC,GACAC,GAC2B;AAC3B,MAAI,CAACD,EAAW,QAAO;AAEvB,QAAME,IAAWD,EAAM,IAAI,YAAA,GACrBE,IAAUD,EAAS,KAAK,QACxBE,IAAUF,EAAS,YAAY;AAErC,MAAIC,IAAU,KAAKC,IAAU,EAAG,QAAO;AAGvC,MAAIC,IAAS,GACTC,IAASH,IAAU;AAEvB,MAAI,CAACH,EAAU,cAAc;AAC3B,UAAMO,IAASP,EAAU;AACzB,QAAI,CAACO,KAAUA,EAAO,WAAW,EAAG,QAAO;AAE3C,UAAMC,IAAcnB,EAAiBY,EAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAGM,CAAM;AACpE,QAAIC,EAAY,SAAS,EAAG,QAAO;AACnC,IAAAH,IAAS,CAAC,GAAGG,CAAW,EAAE,OAAO,CAACC,GAAGC,MAAM,KAAK,IAAID,GAAGC,CAAC,CAAC,GACzDJ,IAAS,CAAC,GAAGE,CAAW,EAAE,OAAO,CAACC,GAAGC,MAAM,KAAK,IAAID,GAAGC,CAAC,CAAC;AAAA,EAC3D;AAGA,MAAIC;AAEJ,MAAI,CAACX,EAAU,iBAAiB;AAC9B,UAAMY,IAASZ,EAAU;AACzB,QAAI,CAACY,KAAUA,EAAO,WAAW,EAAG,QAAO;AAE3C,UAAMC,IAAcxB,EAAiBY,EAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAGW,CAAM;AAC3E,QAAIC,EAAY,SAAS,EAAG,QAAO;AACnC,IAAAF,IAAc,IAAI;AAAA,MAChB,CAAC,GAAGE,CAAW,EACZ,IAAI,CAAAC,MAAUZ,EAAS,YAAYA,EAAS,YAAYY,CAAM,CAAC,CAAC,EAChE,OAAO,CAACC,MAAyBA,MAAS,MAAS;AAAA,IAAA;AAAA,EAE1D;AAEA,SAAO,EAAE,QAAAV,GAAQ,QAAAC,GAAQ,aAAAK,EAAA;AAC3B;"}
|
|
@@ -25,9 +25,11 @@ export type DialogBaseProps = DialogBaseTitleProps & {
|
|
|
25
25
|
sx?: DialogProps['sx'];
|
|
26
26
|
contentProps?: DialogContentProps;
|
|
27
27
|
DialogProps?: Partial<DialogProps>;
|
|
28
|
+
/** If true, reduces the vertical padding of the title, content, and actions for a more compact layout. */
|
|
29
|
+
dense?: boolean;
|
|
28
30
|
};
|
|
29
31
|
/**
|
|
30
32
|
* A dialog built using MUI components.
|
|
31
33
|
*/
|
|
32
|
-
export declare const DialogBase: ({ open, title, content, actions, className, onCancel, hasCloseButton, titleHelpPopoverProps, maxWidth, fullWidth, sx, contentProps, DialogProps, }: DialogBaseProps) => React.ReactNode;
|
|
34
|
+
export declare const DialogBase: ({ open, title, content, actions, className, onCancel, hasCloseButton, titleHelpPopoverProps, maxWidth, fullWidth, sx, contentProps, DialogProps, dense, }: DialogBaseProps) => React.ReactNode;
|
|
33
35
|
//# sourceMappingURL=DialogBase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogBase.d.ts","sourceRoot":"","sources":["../../src/components/DialogBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,kBAAkB,EAClB,WAAW,EAIX,OAAO,EACR,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAe,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAIzE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAGzC,wBAAgB,WAAW,CAAC,EAC1B,EAA2B,EAC3B,OAAO,GACR,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAMtC;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAA;IAChB,qBAAqB,CAAC,EAAE,gBAAgB,CAAA;IACxC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,KAAK,CAAC,SAAS,CA8B5E;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,SAAS,CAAA;IAClB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAA;IAClC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,EAAE,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACtB,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"DialogBase.d.ts","sourceRoot":"","sources":["../../src/components/DialogBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,kBAAkB,EAClB,WAAW,EAIX,OAAO,EACR,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAe,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAIzE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAGzC,wBAAgB,WAAW,CAAC,EAC1B,EAA2B,EAC3B,OAAO,GACR,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAMtC;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAA;IAChB,qBAAqB,CAAC,EAAE,gBAAgB,CAAA;IACxC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,KAAK,CAAC,SAAS,CA8B5E;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,SAAS,CAAA;IAClB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAA;IAClC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,EAAE,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACtB,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAClC,0GAA0G;IAC1G,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,2JAexB,eAAe,KAAG,KAAK,CAAC,SAoD1B,CAAA"}
|