@oneuptime/common 11.7.0 → 11.7.2
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/Models/DatabaseModels/DashboardDomain.ts +1 -0
- package/Models/DatabaseModels/Incident.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Monitor.ts +1 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +1 -0
- package/Models/DatabaseModels/NetworkSite.ts +1 -0
- package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +1 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +2 -0
- package/Models/DatabaseModels/Probe.ts +13 -13
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -0
- package/Models/DatabaseModels/StatusPage.ts +1 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- package/Models/DatabaseModels/StatusPageDomain.ts +1 -0
- package/Models/DatabaseModels/WorkspaceNotificationSummary.ts +1 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +11 -0
- package/Server/API/BaseAPI.ts +17 -1
- package/Server/API/CommonAPI.ts +32 -0
- package/Server/API/MicrosoftTeamsAPI.ts +99 -2
- package/Server/API/ProbeAPI.ts +2 -0
- package/Server/API/SlackAPI.ts +62 -0
- package/Server/API/StatusPageAPI.ts +157 -192
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.ts +61 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.ts +280 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Services/DatabaseService.ts +11 -3
- package/Server/Services/MonitorGroupService.ts +145 -0
- package/Server/Services/MonitorService.ts +231 -30
- package/Server/Services/ProbeService.ts +319 -16
- package/Server/Services/StatusPageService.ts +72 -42
- package/Server/Services/WorkspaceNotificationRuleService.ts +232 -2
- package/Server/Utils/Database/PostgresErrorTranslator.ts +131 -0
- package/Server/Utils/Monitor/MonitorResource.ts +88 -35
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +21 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +158 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +706 -6
- package/Tests/Models/DatabaseModels/ProbeColumnAccessControl.test.ts +103 -0
- package/Tests/Server/API/BaseAPIUpdateNoOp.test.ts +135 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +317 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +228 -0
- package/Tests/Server/API/ProbeAPI.test.ts +6 -0
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +167 -0
- package/Tests/Server/Services/AddHotQueryIndexesMigration.test.ts +255 -0
- package/Tests/Server/Services/AddHotQueryIndexesSecondPassMigration.test.ts +258 -0
- package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +1 -1
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +121 -0
- package/Tests/Server/Services/HeartbeatWriteFastPathSafety.test.ts +200 -0
- package/Tests/Server/Services/HookFreeWriteSafetySecondPass.test.ts +181 -0
- package/Tests/Server/Services/MonitorGroupServiceBatchedStatuses.test.ts +513 -0
- package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +492 -0
- package/Tests/Server/Services/MonitorServiceProbeSelection.test.ts +401 -0
- package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +453 -0
- package/Tests/Server/Services/ProbeAuthKeyCacheAndHeartbeat.test.ts +679 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +3 -3
- package/Tests/Server/Services/StatusPageDomainResolutionCache.test.ts +245 -0
- package/Tests/Server/Services/StatusPageOverviewTimelineWindow.test.ts +283 -0
- package/Tests/Server/Services/StatusPageServiceMcp.test.ts +17 -1
- package/Tests/Server/Services/StatusPageServiceMonitorGroupBatching.test.ts +331 -0
- package/Tests/Server/Services/UserOnCallLogClaimNotificationRule.test.ts +12 -12
- package/Tests/Server/Services/WorkspaceNotificationRuleChats.test.ts +1390 -0
- package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +4 -4
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +1 -3
- package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +1 -3
- package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +1 -1
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +5 -5
- package/Tests/Server/Utils/Alert/AlertPrivacyFilter.test.ts +187 -0
- package/Tests/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.test.ts +170 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +125 -0
- package/Tests/Server/Utils/Incident/IncidentPrivacyFilter.test.ts +264 -0
- package/Tests/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.test.ts +175 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +2 -2
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +341 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +2175 -0
- package/Tests/Server/Utils/Workspace/SlackChannelsList.test.ts +585 -0
- package/Tests/Types/Billing/MeteredPlan.test.ts +46 -0
- package/Tests/Types/DateUserTimezone.test.ts +205 -0
- package/Tests/Types/DateUserTimezoneOverridesBrowser.test.ts +73 -0
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +219 -1
- package/Tests/UI/Components/BulkUpdateForm.test.tsx +174 -0
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +315 -0
- package/Tests/UI/Components/ModelDetailSelect.test.tsx +229 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1258 -0
- package/Tests/UI/Components/ModelTableExportFromColumns.test.ts +153 -0
- package/Tests/UI/Components/MonacoLoader.test.ts +67 -0
- package/Tests/UI/Components/MonacoRuntime.test.ts +121 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +212 -3
- package/Tests/UI/Components/TimePicker/TimePicker.test.tsx +11 -0
- package/Tests/UI/Utils/Project.test.ts +809 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +360 -0
- package/Tests/Utils/Alerts/AlertMetricType.test.ts +143 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +219 -0
- package/Tests/Utils/Incident/IncidentMetricType.test.ts +174 -0
- package/Tests/Utils/Monitor/MonitorProbeSelectionUtil.test.ts +145 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +263 -0
- package/Types/Date.ts +119 -50
- package/Types/Workspace/NotificationRules/BaseNotificationRule.ts +4 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +25 -10
- package/Types/Workspace/WorkspaceMessagePayload.ts +1 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +63 -8
- package/UI/Components/CodeEditor/CodeEditor.tsx +3 -0
- package/UI/Components/CodeEditor/MonacoLoader.ts +36 -0
- package/UI/Components/Forms/Fields/FormField.tsx +13 -3
- package/UI/Components/Forms/ModelForm.tsx +41 -18
- package/UI/Components/Input/Input.tsx +6 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +23 -1
- package/UI/Components/ModelDetail/ModelDetail.tsx +46 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +300 -30
- package/UI/Components/ModelTable/Column.ts +12 -0
- package/UI/Components/ModelTable/ExportFromColumns.ts +57 -0
- package/UI/Components/Navbar/NavBar.tsx +66 -1
- package/UI/Components/Table/Table.tsx +52 -13
- package/UI/Components/Table/Types/Column.ts +18 -0
- package/UI/Components/TimePicker/TimePicker.tsx +8 -4
- package/UI/Utils/Project.ts +214 -18
- package/UI/Utils/TableColumnsToCsv.ts +86 -6
- package/UI/Utils/User.ts +19 -0
- package/UI/esbuild-config.js +34 -0
- package/Utils/Monitor/MonitorProbeSelectionUtil.ts +72 -0
- package/build/dist/Models/DatabaseModels/DashboardDomain.js +1 -0
- package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +2 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Probe.js +13 -13
- package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceNotificationSummary.js +1 -0
- package/build/dist/Models/DatabaseModels/WorkspaceNotificationSummary.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +21 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +72 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +2 -0
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +44 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +98 -152
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.js +254 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +10 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/MonitorGroupService.js +118 -0
- package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +198 -24
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +238 -9
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +46 -39
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +178 -3
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +80 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +67 -29
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +31 -14
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +117 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +549 -7
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Date.js +106 -35
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +17 -7
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +37 -11
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +2 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +34 -0
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +37 -17
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +6 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +22 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +31 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +234 -21
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ExportFromColumns.js +30 -0
- package/build/dist/UI/Components/ModelTable/ExportFromColumns.js.map +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js +39 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +31 -11
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/TimePicker/TimePicker.js +4 -4
- package/build/dist/UI/Components/TimePicker/TimePicker.js.map +1 -1
- package/build/dist/UI/Utils/Project.js +161 -15
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/TableColumnsToCsv.js +67 -6
- package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -1
- package/build/dist/UI/Utils/User.js +19 -0
- package/build/dist/UI/Utils/User.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorProbeSelectionUtil.js +52 -0
- package/build/dist/Utils/Monitor/MonitorProbeSelectionUtil.js.map +1 -0
- package/package.json +4 -3
- package/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.ts +0 -79
- package/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.ts +0 -41
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776886248361-MigrationName.ts +0 -17
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.js +0 -34
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.js.map +0 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.js +0 -22
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.js.map +0 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776886248361-MigrationName.js +0 -12
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776886248361-MigrationName.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardModelDetail.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelDetail/CardModelDetail.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CardModelDetail.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelDetail/CardModelDetail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -15,13 +15,39 @@ const ModelDetail = (props) => {
|
|
|
15
15
|
const [error, setError] = useState("");
|
|
16
16
|
const [item, setItem] = useState(null);
|
|
17
17
|
const [onBeforeFetchData, setOnBeforeFetchData] = useState(undefined);
|
|
18
|
+
/*
|
|
19
|
+
* The server rejects the WHOLE get-item request when the select names a
|
|
20
|
+
* single column the caller cannot read (SelectPermission.checkSelectPermission
|
|
21
|
+
* throws NotAuthorizedException), which blanks the entire card instead of
|
|
22
|
+
* hiding one row. setDetailFields() below already drops unreadable fields
|
|
23
|
+
* from the render, so the fetch has to drop them too - the same thing
|
|
24
|
+
* BaseModelTable does for its selectMoreFields.
|
|
25
|
+
*/
|
|
26
|
+
const hasPermissionToReadField = (fieldName) => {
|
|
27
|
+
var _a;
|
|
28
|
+
if (User.isMasterAdmin()) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const accessControl = new props.modelType().getColumnAccessControlForAllColumns() || {};
|
|
32
|
+
const fieldPermissions = ((_a = accessControl[fieldName]) === null || _a === void 0 ? void 0 : _a.read) || [];
|
|
33
|
+
return PermissionHelper.doesPermissionsIntersect(PermissionUtil.getAllPermissions(), fieldPermissions);
|
|
34
|
+
};
|
|
18
35
|
const getSelectFields = () => {
|
|
19
36
|
const select = {};
|
|
37
|
+
/*
|
|
38
|
+
* _id is never a declared field on most cards, but CardModelDetail needs
|
|
39
|
+
* it to know which record its edit modal is updating. It is exempt from
|
|
40
|
+
* select permission checks server-side, so it is always safe to ask for.
|
|
41
|
+
*/
|
|
42
|
+
select["_id"] = true;
|
|
20
43
|
for (const field of props.fields) {
|
|
21
44
|
if (!field.field) {
|
|
22
45
|
continue;
|
|
23
46
|
}
|
|
24
47
|
for (const key of Object.keys(field.field)) {
|
|
48
|
+
if (!hasPermissionToReadField(key)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
25
51
|
select[key] = true;
|
|
26
52
|
}
|
|
27
53
|
}
|
|
@@ -30,7 +56,8 @@ const ModelDetail = (props) => {
|
|
|
30
56
|
if (typeof field === "string" &&
|
|
31
57
|
field &&
|
|
32
58
|
props.selectMoreFields &&
|
|
33
|
-
props.selectMoreFields[keyofField]
|
|
59
|
+
props.selectMoreFields[keyofField] &&
|
|
60
|
+
hasPermissionToReadField(field)) {
|
|
34
61
|
select[keyofField] = props.selectMoreFields[keyofField];
|
|
35
62
|
}
|
|
36
63
|
}
|
|
@@ -44,6 +71,9 @@ const ModelDetail = (props) => {
|
|
|
44
71
|
continue;
|
|
45
72
|
}
|
|
46
73
|
for (const key of Object.keys(field.field)) {
|
|
74
|
+
if (!hasPermissionToReadField(key)) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
47
77
|
if (model.isFileColumn(key)) {
|
|
48
78
|
relationSelect[key] = {
|
|
49
79
|
file: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelDetail.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelDetail/ModelDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,QAAQ,MAAM,+BAA+B,CAAC;AACrD,OAAO,cAAc,MAAM,wBAAwB,CAAC;AACpD,OAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAEtC,OAAO,YAAY,MAAM,8BAA8B,CAAC;AACxD,OAAO,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQ3D,OAAmB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,EAAgB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkBlD,MAAM,WAAW,GAEG,CAClB,KAAiC,EACnB,EAAE;IAChB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiC,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAE1D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAExD,SAAS,CAAC,CAAC;IAIb,MAAM,eAAe,GAAoB,GAAuB,EAAE;QAChE,MAAM,MAAM,GAAuB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ModelDetail.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelDetail/ModelDetail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ import OrderedStatesList from "../OrderedStatesList/OrderedStatesList";
|
|
|
25
25
|
import Pill from "../Pill/Pill";
|
|
26
26
|
import Table from "../Table/Table";
|
|
27
27
|
import FieldType from "../Types/FieldType";
|
|
28
|
+
import { getExportKeysFromColumn } from "./ExportFromColumns";
|
|
28
29
|
import { getRelationSelectFromColumns, getSelectFromColumns, } from "./SelectFromColumns";
|
|
29
30
|
import AnalyticsBaseModel from "../../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
30
31
|
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
@@ -49,6 +50,20 @@ export var ShowAs;
|
|
|
49
50
|
ShowAs[ShowAs["List"] = 1] = "List";
|
|
50
51
|
ShowAs[ShowAs["OrderedStatesList"] = 2] = "OrderedStatesList";
|
|
51
52
|
})(ShowAs || (ShowAs = {}));
|
|
53
|
+
/*
|
|
54
|
+
* "Select All" loads the whole filtered result set - up to LIMIT_PER_PROJECT
|
|
55
|
+
* rows - with the same columns the table itself fetches. Asking for all of
|
|
56
|
+
* them in one request would mean a single wide, relation-joined query for up
|
|
57
|
+
* to 10,000 rows, which is exactly the kind of query the database statement
|
|
58
|
+
* timeout kills. It is paged instead: each request is comparable in cost to a
|
|
59
|
+
* large page load, so a big selection degrades in latency rather than failing.
|
|
60
|
+
*
|
|
61
|
+
* The page size trades those two costs off. Every list request also runs an
|
|
62
|
+
* unbounded count over the filtered set and pays a growing OFFSET, so smaller
|
|
63
|
+
* pages multiply that overhead; 1,000 keeps each query well inside the
|
|
64
|
+
* statement timeout while capping a maxed-out selection at ten round trips.
|
|
65
|
+
*/
|
|
66
|
+
export const BULK_SELECT_ALL_PAGE_SIZE = 1000;
|
|
52
67
|
export var ModalTableBulkDefaultActions;
|
|
53
68
|
(function (ModalTableBulkDefaultActions) {
|
|
54
69
|
ModalTableBulkDefaultActions["Delete"] = "Delete";
|
|
@@ -69,6 +84,23 @@ const BaseModelTable = (props) => {
|
|
|
69
84
|
const matchBulkSelectedItemByField = ((_a = props.bulkActions) === null || _a === void 0 ? void 0 : _a.matchBulkSelectedItemByField) || "_id";
|
|
70
85
|
const model = new props.modelType();
|
|
71
86
|
const [bulkSelectedItems, setBulkSelectedItems] = useState([]);
|
|
87
|
+
/*
|
|
88
|
+
* "Select All" gets its own loading / error state instead of sharing
|
|
89
|
+
* `isLoading` and `error` with fetchItems. They ran concurrently before, so
|
|
90
|
+
* a page refresh landing mid-selection flipped the spinner off and cleared
|
|
91
|
+
* the other's error - which is how a failed select-all could leave the user
|
|
92
|
+
* with only the current page selected and nothing on screen to say so.
|
|
93
|
+
*/
|
|
94
|
+
const [isBulkSelectAllLoading, setIsBulkSelectAllLoading] = useState(false);
|
|
95
|
+
const [bulkSelectionError, setBulkSelectionError] = useState("");
|
|
96
|
+
const [bulkSelectionTotalCount, setBulkSelectionTotalCount] = useState(0);
|
|
97
|
+
const [isBulkSelectionTruncated, setIsBulkSelectionTruncated] = useState(false);
|
|
98
|
+
/*
|
|
99
|
+
* The paged select-all spans several round trips, so the user can clear the
|
|
100
|
+
* selection or start another one while it is still running. Every run takes
|
|
101
|
+
* a token and drops its results if a newer one has since started.
|
|
102
|
+
*/
|
|
103
|
+
const bulkSelectAllToken = React.useRef(0);
|
|
72
104
|
let showAs = props.showAs;
|
|
73
105
|
if (!showAs) {
|
|
74
106
|
showAs = ShowAs.Table;
|
|
@@ -518,7 +550,19 @@ const BaseModelTable = (props) => {
|
|
|
518
550
|
"." +
|
|
519
551
|
column.selectedProperty)
|
|
520
552
|
: key;
|
|
521
|
-
columns.push(Object.assign(Object.assign({}, column), { disableSort: column.disableSort || shouldDisableSort(key), key: columnKey,
|
|
553
|
+
columns.push(Object.assign(Object.assign({}, column), { disableSort: column.disableSort || shouldDisableSort(key), key: columnKey,
|
|
554
|
+
/*
|
|
555
|
+
* `key` is only the first declared field, so a cell composed from
|
|
556
|
+
* several of them would export just that one. Hand the exporter
|
|
557
|
+
* every field the column declares (and that we actually selected).
|
|
558
|
+
*/
|
|
559
|
+
exportKeys: getExportKeysFromColumn({
|
|
560
|
+
column: column,
|
|
561
|
+
columnKey: columnKey ? String(columnKey) : null,
|
|
562
|
+
hasPermissionToReadField: (field) => {
|
|
563
|
+
return hasPermissionToReadField(field);
|
|
564
|
+
},
|
|
565
|
+
}), tooltipText, getElement: column.getElement }));
|
|
522
566
|
if (key) {
|
|
523
567
|
selectFields[key] = true;
|
|
524
568
|
}
|
|
@@ -760,28 +804,194 @@ const BaseModelTable = (props) => {
|
|
|
760
804
|
}
|
|
761
805
|
return fragment;
|
|
762
806
|
};
|
|
807
|
+
/*
|
|
808
|
+
* Selects every row matching the table's current query, filters and search -
|
|
809
|
+
* not just the rows on screen - and returns whether it succeeded.
|
|
810
|
+
*
|
|
811
|
+
* It fetches the SAME columns as fetchItems. It used to ask for
|
|
812
|
+
* `select: { _id: true }`, which picked the right rows but stripped every
|
|
813
|
+
* field off them, so "Export CSV" over a select-all wrote one blank line per
|
|
814
|
+
* row and any bulk action that reads a field (or renders an item's name) saw
|
|
815
|
+
* undefined. Routing the projection through getSelect() also keeps
|
|
816
|
+
* `selectMoreFields` and per-field read permissions in play, which a
|
|
817
|
+
* hand-rolled column list would silently drop.
|
|
818
|
+
*/
|
|
763
819
|
const fetchAllBulkItems = async () => {
|
|
764
|
-
|
|
765
|
-
|
|
820
|
+
var _a;
|
|
821
|
+
const token = ++bulkSelectAllToken.current;
|
|
822
|
+
setBulkSelectionError("");
|
|
823
|
+
setIsBulkSelectionTruncated(false);
|
|
824
|
+
setIsBulkSelectAllLoading(true);
|
|
825
|
+
const itemsSelected = [];
|
|
766
826
|
try {
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
827
|
+
/*
|
|
828
|
+
* An unsorted table is served in the API's default order, so the
|
|
829
|
+
* selection has to ask for that order explicitly - once any sort is
|
|
830
|
+
* sent, the server stops applying its default. Without this the rows
|
|
831
|
+
* came back in random UUID order, which both scrambled the exported
|
|
832
|
+
* CSV and, on a table past the selection ceiling, kept an arbitrary
|
|
833
|
+
* slice of history instead of the newest rows the user was looking at.
|
|
834
|
+
*/
|
|
835
|
+
const defaultSortColumn = model.defaultSortColumn || "createdAt";
|
|
836
|
+
const bulkSort = (sortBy
|
|
837
|
+
? { [sortBy]: sortOrder }
|
|
838
|
+
: { [defaultSortColumn]: SortOrder.Descending });
|
|
839
|
+
/*
|
|
840
|
+
* skip/limit paging is only stable over a total order. The field that
|
|
841
|
+
* identifies a selected row (`_id` unless a table overrides it) is
|
|
842
|
+
* appended as a tiebreaker so rows sharing a sort value - 1,200 labels
|
|
843
|
+
* imported in one transaction all share a createdAt - cannot land on
|
|
844
|
+
* two pages while another row is never returned at all.
|
|
845
|
+
*/
|
|
846
|
+
if (bulkSort[matchBulkSelectedItemByField] === undefined) {
|
|
847
|
+
bulkSort[matchBulkSelectedItemByField] = SortOrder.Ascending;
|
|
848
|
+
}
|
|
849
|
+
/*
|
|
850
|
+
* getSelect() throws on a misconfigured column, so it is built inside
|
|
851
|
+
* the try: otherwise the button would be left spinning forever with an
|
|
852
|
+
* unhandled rejection instead of a message.
|
|
853
|
+
*/
|
|
854
|
+
const bulkSelect = Object.assign(Object.assign({}, getSelect()), getRelationSelect());
|
|
855
|
+
/*
|
|
856
|
+
* Every ordered column has to be selected for the database to order by
|
|
857
|
+
* it. `_id` always is; the default sort column usually is not, and a
|
|
858
|
+
* table matching its selection on some field other than `_id` would
|
|
859
|
+
* otherwise tick no row checkboxes at all.
|
|
860
|
+
*/
|
|
861
|
+
for (const sortColumn of Object.keys(bulkSort)) {
|
|
862
|
+
if (bulkSelect[sortColumn] === undefined &&
|
|
863
|
+
model.hasColumn(sortColumn)) {
|
|
864
|
+
bulkSelect[sortColumn] = true;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
let totalCount = 0;
|
|
868
|
+
let hasMore = false;
|
|
869
|
+
let rowsFetched = 0;
|
|
870
|
+
/*
|
|
871
|
+
* Offset paging over a table that is still receiving writes can hand
|
|
872
|
+
* back a row that an earlier page already returned. Selecting it twice
|
|
873
|
+
* would duplicate it in the export and inflate the selected count.
|
|
874
|
+
*/
|
|
875
|
+
const seenItemIds = new Set();
|
|
876
|
+
while (itemsSelected.length < LIMIT_PER_PROJECT) {
|
|
877
|
+
const limit = Math.min(BULK_SELECT_ALL_PAGE_SIZE, LIMIT_PER_PROJECT - itemsSelected.length);
|
|
878
|
+
const listResult = await props.callbacks.getList({
|
|
879
|
+
modelType: props.modelType,
|
|
880
|
+
query: Object.assign(Object.assign(Object.assign({}, props.query), query), buildSearchQueryFragment()),
|
|
881
|
+
groupBy: Object.assign({}, props.groupBy),
|
|
882
|
+
limit: limit,
|
|
883
|
+
skip: rowsFetched,
|
|
884
|
+
select: bulkSelect,
|
|
885
|
+
sort: bulkSort,
|
|
886
|
+
requestOptions: props.fetchRequestOptions,
|
|
887
|
+
});
|
|
888
|
+
if (token !== bulkSelectAllToken.current) {
|
|
889
|
+
// A newer select-all, or a cleared selection, superseded this run.
|
|
890
|
+
return false;
|
|
891
|
+
}
|
|
892
|
+
totalCount = listResult.count || totalCount;
|
|
893
|
+
hasMore = Boolean(listResult.hasMore);
|
|
894
|
+
rowsFetched += listResult.data.length;
|
|
895
|
+
for (const item of listResult.data) {
|
|
896
|
+
const itemId = ((_a = item[matchBulkSelectedItemByField]) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
897
|
+
if (itemId) {
|
|
898
|
+
if (seenItemIds.has(itemId)) {
|
|
899
|
+
continue;
|
|
900
|
+
}
|
|
901
|
+
seenItemIds.add(itemId);
|
|
902
|
+
}
|
|
903
|
+
itemsSelected.push(item);
|
|
904
|
+
}
|
|
905
|
+
if (listResult.data.length < limit) {
|
|
906
|
+
// A short page is the last page.
|
|
907
|
+
hasMore = false;
|
|
908
|
+
break;
|
|
909
|
+
}
|
|
910
|
+
if (listResult.hasMore === false) {
|
|
911
|
+
break;
|
|
912
|
+
}
|
|
913
|
+
if (totalCount > 0 && rowsFetched >= totalCount) {
|
|
914
|
+
/*
|
|
915
|
+
* Everything matching has been read. Stopping here saves the
|
|
916
|
+
* empty round trip a result set that is an exact multiple of the
|
|
917
|
+
* page size would otherwise cost - and each of those requests
|
|
918
|
+
* runs a full count over the filtered set.
|
|
919
|
+
*/
|
|
920
|
+
break;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
setBulkSelectionTotalCount(Math.max(totalCount, itemsSelected.length));
|
|
924
|
+
setIsBulkSelectionTruncated(totalCount > rowsFetched || hasMore);
|
|
925
|
+
setBulkSelectedItems(itemsSelected);
|
|
926
|
+
return true;
|
|
779
927
|
}
|
|
780
928
|
catch (err) {
|
|
781
|
-
|
|
929
|
+
if (token === bulkSelectAllToken.current) {
|
|
930
|
+
/*
|
|
931
|
+
* Leave the existing selection alone. A half-loaded selection that
|
|
932
|
+
* claims to be everything is worse than a failed one, and the user
|
|
933
|
+
* can retry because the Select All button stays on screen.
|
|
934
|
+
*/
|
|
935
|
+
setBulkSelectionError(API.getFriendlyMessage(err));
|
|
936
|
+
}
|
|
937
|
+
return false;
|
|
782
938
|
}
|
|
783
|
-
|
|
939
|
+
finally {
|
|
940
|
+
if (token === bulkSelectAllToken.current) {
|
|
941
|
+
setIsBulkSelectAllLoading(false);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
};
|
|
945
|
+
const clearBulkSelectionState = () => {
|
|
946
|
+
// Supersede any select-all still in flight so it cannot repopulate this.
|
|
947
|
+
bulkSelectAllToken.current++;
|
|
948
|
+
setIsBulkSelectAllLoading(false);
|
|
949
|
+
setBulkSelectionError("");
|
|
950
|
+
setIsBulkSelectionTruncated(false);
|
|
951
|
+
setBulkSelectionTotalCount(0);
|
|
952
|
+
setBulkSelectedItems((existingItems) => {
|
|
953
|
+
/*
|
|
954
|
+
* Keep the same array when there is nothing to clear, so calling this on
|
|
955
|
+
* every query change (below) costs an idle table no re-render.
|
|
956
|
+
*/
|
|
957
|
+
return existingItems.length === 0 ? existingItems : [];
|
|
958
|
+
});
|
|
784
959
|
};
|
|
960
|
+
/*
|
|
961
|
+
* Everything that decides *which rows match* - the caller's query, the
|
|
962
|
+
* column filters, the search term and the label chips. Serialised because
|
|
963
|
+
* callers routinely pass `query` as a fresh object literal on every render,
|
|
964
|
+
* and the label chips get their display names hydrated after mount without
|
|
965
|
+
* the set of ids ever changing.
|
|
966
|
+
*
|
|
967
|
+
* Sort and page are deliberately left out: they re-order or re-window the
|
|
968
|
+
* same matching set, so a selection made under them is still a selection of
|
|
969
|
+
* rows that match. Selecting rows across pages is a real workflow, and a
|
|
970
|
+
* truncated select-all keeps saying "selected N of M matching" after a
|
|
971
|
+
* re-sort, which stays true.
|
|
972
|
+
*/
|
|
973
|
+
const effectiveQueryKey = JSON.stringify({
|
|
974
|
+
props: props.query || {},
|
|
975
|
+
filter: query,
|
|
976
|
+
search: debouncedSearchText.trim(),
|
|
977
|
+
labels: selectedLabelIdsKey,
|
|
978
|
+
});
|
|
979
|
+
/*
|
|
980
|
+
* A selection refers to the rows the *previous* query returned. Once the
|
|
981
|
+
* query changes, the table underneath the bulk bar is a different result
|
|
982
|
+
* set, so carrying the selection over leaves the bar claiming "6,000 Alerts
|
|
983
|
+
* Selected" above a filtered-down list of 12 - with the Select All button
|
|
984
|
+
* hidden, as though the selection matched what is on screen, and Delete
|
|
985
|
+
* still wired to all 6,000 rows the user can no longer see.
|
|
986
|
+
*
|
|
987
|
+
* Dropping it here also bumps `bulkSelectAllToken`, so a filter change that
|
|
988
|
+
* lands while a paged select-all is still running supersedes that run
|
|
989
|
+
* instead of letting it finish and repopulate the selection against the old
|
|
990
|
+
* query.
|
|
991
|
+
*/
|
|
992
|
+
useEffect(() => {
|
|
993
|
+
clearBulkSelectionState();
|
|
994
|
+
}, [effectiveQueryKey]);
|
|
785
995
|
const fetchItems = async () => {
|
|
786
996
|
setError("");
|
|
787
997
|
setIsLoading(true);
|
|
@@ -1412,11 +1622,14 @@ const BaseModelTable = (props) => {
|
|
|
1412
1622
|
}),
|
|
1413
1623
|
};
|
|
1414
1624
|
})(), onBulkActionEnd: async () => {
|
|
1415
|
-
|
|
1625
|
+
clearBulkSelectionState();
|
|
1416
1626
|
await fetchItems();
|
|
1417
1627
|
}, onBulkActionStart: () => { }, bulkSelectedItems: bulkSelectedItems, onBulkSelectedItemAdded: (item) => {
|
|
1628
|
+
// The user has moved on from the failed select-all.
|
|
1629
|
+
setBulkSelectionError("");
|
|
1418
1630
|
setBulkSelectedItems([...bulkSelectedItems, item]);
|
|
1419
1631
|
}, onBulkSelectedItemRemoved: (item) => {
|
|
1632
|
+
setBulkSelectionError("");
|
|
1420
1633
|
setBulkSelectedItems(bulkSelectedItems.filter((i) => {
|
|
1421
1634
|
var _a, _b;
|
|
1422
1635
|
return (((_a = i[matchBulkSelectedItemByField]) === null || _a === void 0 ? void 0 : _a.toString()) !==
|
|
@@ -1435,10 +1648,10 @@ const BaseModelTable = (props) => {
|
|
|
1435
1648
|
});
|
|
1436
1649
|
setBulkSelectedItems(uniqueItems);
|
|
1437
1650
|
}, onBulkClearAllItems: () => {
|
|
1438
|
-
|
|
1651
|
+
clearBulkSelectionState();
|
|
1439
1652
|
}, onBulkSelectAllItems: async () => {
|
|
1440
|
-
await fetchAllBulkItems();
|
|
1441
|
-
}, matchBulkSelectedItemByField: matchBulkSelectedItemByField || "_id", bulkItemToString: (item) => {
|
|
1653
|
+
return await fetchAllBulkItems();
|
|
1654
|
+
}, bulkSelectionError: bulkSelectionError, isBulkSelectAllLoading: isBulkSelectAllLoading, isBulkSelectionTruncated: isBulkSelectionTruncated, bulkSelectionTotalCount: bulkSelectionTotalCount, matchBulkSelectedItemByField: matchBulkSelectedItemByField || "_id", bulkItemToString: (item) => {
|
|
1442
1655
|
var _a, _b;
|
|
1443
1656
|
const label = props.singularName || item.singularName || "";
|
|
1444
1657
|
const name = ((_a = item["name"]) === null || _a === void 0 ? void 0 : _a.toString()) ||
|