@oneuptime/common 11.7.2 → 11.7.4
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/AnalyticsModels/KubernetesCostAllocation.ts +103 -0
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +5 -0
- package/Models/DatabaseModels/LogDropFilter.ts +89 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
- package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
- package/Models/DatabaseModels/TableView.ts +40 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
- package/Server/API/AlertAPI.ts +32 -17
- package/Server/API/BaseAPI.ts +31 -2
- package/Server/API/BaseAnalyticsAPI.ts +36 -2
- package/Server/API/CommonAPI.ts +57 -0
- package/Server/API/IncidentAPI.ts +60 -33
- package/Server/API/IncidentEpisodeAPI.ts +31 -16
- package/Server/API/MonitorAPI.ts +30 -0
- package/Server/API/MonitorTemplateAPI.ts +8 -0
- package/Server/API/ProbeAPI.ts +196 -15
- package/Server/API/ProjectAPI.ts +79 -1
- package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
- package/Server/API/StatusPageAPI.ts +74 -37
- package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AlertEpisodeService.ts +47 -0
- package/Server/Services/AlertService.ts +125 -0
- package/Server/Services/BillingService.ts +98 -0
- package/Server/Services/DatabaseService.ts +184 -20
- package/Server/Services/IncidentEpisodeService.ts +47 -0
- package/Server/Services/IncidentService.ts +123 -0
- package/Server/Services/IncidentTemplateService.ts +123 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/LogDropFilterService.ts +133 -0
- package/Server/Services/MonitorProbeService.ts +94 -4
- package/Server/Services/MonitorService.ts +48 -43
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
- package/Server/Services/ProbeService.ts +66 -0
- package/Server/Services/ProjectService.ts +131 -7
- package/Server/Services/RecommendationDismissalService.ts +52 -0
- package/Server/Services/RunbookAgentJobService.ts +68 -7
- package/Server/Services/ScheduledMaintenanceService.ts +103 -0
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
- package/Server/Services/StatusPageGroupService.ts +186 -0
- package/Server/Services/TraceDropFilterService.ts +133 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
- package/Server/Types/Workflow/Components/API/Get.ts +12 -0
- package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
- package/Server/Types/Workflow/Components/API/Post.ts +12 -0
- package/Server/Types/Workflow/Components/API/Put.ts +13 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
- package/Server/Utils/DropFilterValidation.ts +127 -0
- package/Server/Utils/Errors.ts +5 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
- package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
- package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
- package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
- package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
- package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
- package/Tests/Server/API/ProbeAPI.test.ts +422 -53
- package/Tests/Server/API/ProjectAPI.test.ts +180 -0
- package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
- package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
- package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
- package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
- package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
- package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
- package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
- package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
- package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
- package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
- package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
- package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
- package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
- package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
- package/Tests/Types/DateUserTimezone.test.ts +52 -0
- package/Tests/Types/JSONFunctions.test.ts +103 -1
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
- package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
- package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
- package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
- package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
- package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
- package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
- package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
- package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
- package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
- package/Tests/UI/Components/InfoCard.test.tsx +358 -0
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
- package/Tests/UI/Components/Modal.test.tsx +43 -5
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
- package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
- package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
- package/Tests/Utils/UserPreferences.test.ts +563 -0
- package/Types/Date.ts +15 -6
- package/Types/JSONFunctions.ts +7 -2
- package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
- package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
- package/Types/Permission.ts +45 -0
- package/Types/Recommendation/RecommendationType.ts +20 -0
- package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
- package/Types/Runbook/RunbookStepTimeout.ts +202 -0
- package/Types/Telemetry/DropFilterSampling.ts +92 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
- package/UI/Components/Accordion/Accordion.tsx +10 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
- package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
- package/UI/Components/Error/PageError.tsx +0 -4
- package/UI/Components/ErrorBoundary.tsx +252 -15
- package/UI/Components/InfoCard/InfoCard.tsx +58 -1
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
- package/UI/Components/MasterPage/MasterPage.tsx +65 -0
- package/UI/Components/Modal/Modal.tsx +16 -60
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
- package/UI/Components/ModelTable/Column.ts +17 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
- package/UI/Components/ModelTable/TableView.tsx +24 -2
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
- package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
- package/UI/Components/SideMenu/SideMenu.tsx +24 -4
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
- package/UI/Components/Table/Table.tsx +14 -1
- package/UI/Components/Table/TableRow.tsx +180 -175
- package/UI/Components/Table/Types/Column.ts +2 -0
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
- package/UI/Utils/DropdownAlignment.ts +162 -0
- package/UI/Utils/TableFilterUrlState.ts +59 -20
- package/Utils/API.ts +106 -2
- package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
- package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
- package/Utils/StatusPage/GroupTree.ts +307 -0
- package/Utils/StatusPage/ResourceUptime.ts +90 -17
- package/Utils/UserPreferences.ts +53 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.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/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +40 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +22 -13
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +22 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +42 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +43 -26
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +23 -0
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
- package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +131 -15
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +62 -3
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +61 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +95 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +71 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +140 -17
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +100 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogDropFilterService.js +93 -0
- package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +73 -5
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +34 -39
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +64 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +103 -7
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
- package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
- package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
- package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
- package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
- package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
- package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
- package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
- package/build/dist/Server/Utils/Errors.js +3 -0
- package/build/dist/Server/Utils/Errors.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Types/Date.js +14 -4
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +8 -3
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +40 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
- package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Error/PageError.js +1 -3
- package/build/dist/UI/Components/Error/PageError.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +145 -11
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +4 -32
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
- package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +15 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +11 -6
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
- package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
- package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/Utils/API.js +39 -2
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/UserPreferences.js +33 -0
- package/build/dist/Utils/UserPreferences.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ButtonStyleType } from "../Button/Button";
|
|
2
2
|
import ButtonType from "../Button/ButtonTypes";
|
|
3
|
-
import Icon
|
|
3
|
+
import Icon from "../Icon/Icon";
|
|
4
4
|
import Loader, { LoaderType } from "../Loader/Loader";
|
|
5
5
|
import ModalBody from "./ModalBody";
|
|
6
6
|
import ModalFooter from "./ModalFooter";
|
|
@@ -96,29 +96,6 @@ const Modal = (props) => {
|
|
|
96
96
|
}
|
|
97
97
|
};
|
|
98
98
|
}, []);
|
|
99
|
-
let iconBgColor = "bg-indigo-50";
|
|
100
|
-
let iconColor = "text-indigo-600";
|
|
101
|
-
let iconRingColor = "ring-indigo-100";
|
|
102
|
-
if (props.iconType === IconType.Info) {
|
|
103
|
-
iconBgColor = "bg-indigo-50";
|
|
104
|
-
iconColor = "text-indigo-600";
|
|
105
|
-
iconRingColor = "ring-indigo-100";
|
|
106
|
-
}
|
|
107
|
-
else if (props.iconType === IconType.Warning) {
|
|
108
|
-
iconBgColor = "bg-yellow-50";
|
|
109
|
-
iconColor = "text-yellow-700";
|
|
110
|
-
iconRingColor = "ring-yellow-100";
|
|
111
|
-
}
|
|
112
|
-
else if (props.iconType === IconType.Success) {
|
|
113
|
-
iconBgColor = "bg-green-50";
|
|
114
|
-
iconColor = "text-green-600";
|
|
115
|
-
iconRingColor = "ring-green-100";
|
|
116
|
-
}
|
|
117
|
-
else if (props.iconType === IconType.Danger) {
|
|
118
|
-
iconBgColor = "bg-red-50";
|
|
119
|
-
iconColor = "text-red-600";
|
|
120
|
-
iconRingColor = "ring-red-100";
|
|
121
|
-
}
|
|
122
99
|
let modalWidthClassName = "sm:max-w-lg md:max-w-lg";
|
|
123
100
|
if (props.modalWidth === ModalWidth.Medium) {
|
|
124
101
|
modalWidthClassName = "sm:max-w-3xl md:max-w-3xl";
|
|
@@ -132,14 +109,9 @@ const Modal = (props) => {
|
|
|
132
109
|
React.createElement("div", { className: "flex min-h-full items-end justify-center p-0 text-center sm:items-center sm:p-6" },
|
|
133
110
|
React.createElement("div", { ref: modalRef, className: `relative flex max-h-[calc(100vh-1rem)] w-full flex-col rounded-t-2xl border border-gray-200/80 bg-white text-left shadow-2xl ring-1 ring-black/5 sm:my-8 sm:max-h-[calc(100vh-3rem)] sm:rounded-xl ${modalWidthClassName}`, "data-testid": "modal", "aria-labelledby": titleId, "aria-describedby": translatedDescription ? descriptionId : undefined, role: "dialog", "aria-modal": "true", tabIndex: -1 },
|
|
134
111
|
React.createElement("div", { className: "relative flex shrink-0 flex-col gap-4 rounded-t-2xl border-b border-gray-100 bg-white px-5 py-4 sm:flex-row sm:items-start sm:justify-between sm:gap-6 sm:rounded-t-xl sm:px-6" },
|
|
135
|
-
React.createElement("div", { className: `
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
? IconType.Info
|
|
139
|
-
: props.iconType, className: `${iconColor} h-5 w-5`, icon: props.icon, size: SizeProp.Five }))),
|
|
140
|
-
React.createElement("div", { className: "min-w-0 flex-1" },
|
|
141
|
-
React.createElement("h3", { "data-testid": "modal-title", className: "text-base font-semibold leading-6 tracking-tight text-gray-900", id: titleId }, translatedTitle),
|
|
142
|
-
translatedDescription && (React.createElement("p", { id: descriptionId, "data-testid": "modal-description", className: "mt-0.5 text-sm leading-5 text-gray-500" }, translatedDescription)))),
|
|
112
|
+
React.createElement("div", { className: `min-w-0 flex-1 ${props.onClose ? "pr-9 sm:pr-0" : ""}` },
|
|
113
|
+
React.createElement("h3", { "data-testid": "modal-title", className: "text-base font-semibold leading-6 tracking-tight text-gray-900", id: titleId }, translatedTitle),
|
|
114
|
+
translatedDescription && (React.createElement("p", { id: descriptionId, "data-testid": "modal-description", className: "mt-0.5 text-sm leading-5 text-gray-500" }, translatedDescription))),
|
|
143
115
|
props.rightElement && (React.createElement("div", { "data-testid": "right-element", className: `flex-shrink-0 ${props.onClose ? "pr-9" : ""}` }, props.rightElement)),
|
|
144
116
|
props.onClose && (React.createElement("button", { type: "button", title: translatedCloseLabel, "aria-label": translatedCloseLabel, "data-testid": "close-button", onClick: props.onClose, className: "absolute right-4 top-4 inline-flex h-8 w-8 items-center justify-center rounded-md text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-2" },
|
|
145
117
|
React.createElement(Icon, { icon: IconProp.Close, className: "h-4 w-4" })))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../../../UI/Components/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../../../UI/Components/Modal/Modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelFormModal.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelFormModal/ModelFormModal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,OAAO,SAEN,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ModelFormModal.js","sourceRoot":"","sources":["../../../../../UI/Components/ModelFormModal/ModelFormModal.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,OAAO,SAEN,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,SAAS,MAAM,oEAAoE,CAAC;AAG3F,OAAO,KAAK,EAAE,EAAkC,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAuBhF,MAAM,cAAc,GAEA,CAClB,KAAiC,EACnB,EAAE;IAChB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAEnE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CACtD,KAAK,CAAC,gBAAgB,IAAI,MAAM,CACjC,CAAC;IAEF,MAAM,OAAO,GACX,KAAK,CAAC,OAAO;QACZ,MAAM,CAAoC,IAAI,CAE7C,CAAC;IAEL,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE/C,IAAI,UAAU,GAAe,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC;IAEnE,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC;IACrD,CAAC;IAED,OAAO,CACL,oBAAC,KAAK,oBACA,KAAK,IACT,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,UAAU,CAAC,MAAM,EACnC,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,mBAAmB,EAAE,aAAa,EAClC,QAAQ,EAAE,KAAK,IAAI,EAAE;;YACnB,MAAM,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU,EAAE,CAAA,CAAC;QACtC,CAAC,EACD,KAAK,EAAE,KAAK;QAEX,CAAC,KAAK,CAAC,CAAC,CAAC,CACR;YACE,oBAAC,SAAS,oBACJ,KAAK,CAAC,SAAS,IACnB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,gBAAgB,EAAE,CAAC,cAAuB,EAAE,EAAE;oBAC5C,IAAI,cAAc,EAAE,CAAC;wBACnB,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;oBACxD,CAAC;yBAAM,CAAC;wBACN,mBAAmB,CAAC,MAAM,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC,EACD,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,gBAAgB,EAAE,IAAI,EACtB,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,CAAC,aAAsB,EAAE,EAAE;oBAC1C,gBAAgB,CAAC,aAAa,CAAC,CAAC;gBAClC,CAAC,EACD,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,SAAS,EAAE,CAAC,IAAgB,EAAE,EAAE;oBAC9B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;wBACpB,KAAK,CAAC,SAAS,CACb,SAAS,CAAC,cAAc,CAAC,IAAkB,EAAE,KAAK,CAAC,SAAS,CAAC,CAC9D,CAAC;oBACJ,CAAC;gBACH,CAAC,EACD,OAAO,EAAE,CAAC,KAAa,EAAE,EAAE;oBACzB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC,EACD,cAAc,EAAE,KAAK,CAAC,cAAc,IACpC;YAED,KAAK,CAAC,MAAM,CACZ,CACJ,CAAC,CAAC,CAAC,CACF,yCAAK,CACN;QAEA,KAAK,CAAC,CAAC,CAAC,oBAAC,KAAK,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAI,CAAC,CAAC,CAAC,yCAAK,CAC1D,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -25,6 +25,10 @@ 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 ColumnCustomizationModal from "./ColumnCustomizationModal";
|
|
29
|
+
import { applyColumnPreference, buildColumnPreference, fromJSON as columnPreferenceFromJSON, getCustomizableColumns, isEmptyColumnPreference, sanitizeColumnPreference, getColumnIds, toJSON as columnPreferenceToJSON, } from "./ColumnPreference";
|
|
30
|
+
import { CustomFieldsColumnKey } from "./CustomFieldColumns";
|
|
31
|
+
import useCustomFieldColumns from "./useCustomFieldColumns";
|
|
28
32
|
import { getExportKeysFromColumn } from "./ExportFromColumns";
|
|
29
33
|
import { getRelationSelectFromColumns, getSelectFromColumns, } from "./SelectFromColumns";
|
|
30
34
|
import AnalyticsBaseModel from "../../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
@@ -110,6 +114,83 @@ const BaseModelTable = (props) => {
|
|
|
110
114
|
const [showHelpModal, setShowHelpModal] = useState(false);
|
|
111
115
|
const [viewId, setViewId] = useState(null);
|
|
112
116
|
const [tableColumns, setColumns] = useState([]);
|
|
117
|
+
/*
|
|
118
|
+
* ---------------------------------------------------------------------
|
|
119
|
+
* Viewer-customizable columns
|
|
120
|
+
* ---------------------------------------------------------------------
|
|
121
|
+
*
|
|
122
|
+
* The viewer's layout (which columns are on, and in what order) is a
|
|
123
|
+
* personal, presentational preference, so it lives in localStorage next to
|
|
124
|
+
* the page size rather than on the server: saved views are named, explicit,
|
|
125
|
+
* plan-gated and need write permission, none of which should stand between
|
|
126
|
+
* someone and hiding a column they don't care about. A saved view can still
|
|
127
|
+
* carry a layout of its own, and when one is active it wins.
|
|
128
|
+
*
|
|
129
|
+
* Custom fields are appended to the declared columns as additional,
|
|
130
|
+
* off-by-default columns; from here on they are ordinary columns.
|
|
131
|
+
*/
|
|
132
|
+
const customFieldColumns = useCustomFieldColumns({
|
|
133
|
+
customFieldsModelType: props.customFieldsModelType,
|
|
134
|
+
});
|
|
135
|
+
const isColumnCustomizationEnabled = Boolean(!props.disableColumnCustomization &&
|
|
136
|
+
props.userPreferencesKey &&
|
|
137
|
+
showAs !== ShowAs.OrderedStatesList);
|
|
138
|
+
const allColumns = useMemo(() => {
|
|
139
|
+
if (customFieldColumns.columns.length === 0) {
|
|
140
|
+
return props.columns || [];
|
|
141
|
+
}
|
|
142
|
+
return [...(props.columns || []), ...customFieldColumns.columns];
|
|
143
|
+
}, [props.columns, customFieldColumns.columns]);
|
|
144
|
+
const readStoredColumnPreference = () => {
|
|
145
|
+
if (!props.userPreferencesKey) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
return columnPreferenceFromJSON(UserPreferences.getUserPreferenceByTypeAsJSON({
|
|
149
|
+
key: props.userPreferencesKey,
|
|
150
|
+
userPreferenceType: UserPreferenceType.BaseModelTableColumns,
|
|
151
|
+
}));
|
|
152
|
+
};
|
|
153
|
+
const [columnPreference, setColumnPreference] = useState(readStoredColumnPreference);
|
|
154
|
+
const [showColumnCustomizationModal, setShowColumnCustomizationModal] = useState(false);
|
|
155
|
+
/*
|
|
156
|
+
* Ids are derived over the *whole* declared set, so a column dropping out
|
|
157
|
+
* for lack of permission can never renumber the ones that remain.
|
|
158
|
+
*/
|
|
159
|
+
const allColumnIds = useMemo(() => {
|
|
160
|
+
return getColumnIds(allColumns);
|
|
161
|
+
}, [allColumns]);
|
|
162
|
+
const effectiveColumnPreference = useMemo(() => {
|
|
163
|
+
if (!isColumnCustomizationEnabled) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/*
|
|
167
|
+
* A stored layout outlives the release that wrote it, so anything naming
|
|
168
|
+
* a column this table no longer has is dropped before it is applied.
|
|
169
|
+
*/
|
|
170
|
+
return sanitizeColumnPreference({
|
|
171
|
+
preference: columnPreference,
|
|
172
|
+
knownColumnIds: allColumnIds,
|
|
173
|
+
});
|
|
174
|
+
}, [columnPreference, allColumnIds, isColumnCustomizationEnabled]);
|
|
175
|
+
const saveColumnPreference = (preference) => {
|
|
176
|
+
setColumnPreference(preference);
|
|
177
|
+
if (!props.userPreferencesKey) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const json = columnPreferenceToJSON(preference);
|
|
181
|
+
if (!json) {
|
|
182
|
+
UserPreferences.removeUserPreferenceByType({
|
|
183
|
+
key: props.userPreferencesKey,
|
|
184
|
+
userPreferenceType: UserPreferenceType.BaseModelTableColumns,
|
|
185
|
+
});
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
UserPreferences.saveUserPreferenceByTypeAsJSON({
|
|
189
|
+
key: props.userPreferencesKey,
|
|
190
|
+
userPreferenceType: UserPreferenceType.BaseModelTableColumns,
|
|
191
|
+
value: json,
|
|
192
|
+
});
|
|
193
|
+
};
|
|
113
194
|
const [classicTableFilters, setClassicTableFilters] = useState([]);
|
|
114
195
|
const [cardButtons, setCardButtons] = useState([]);
|
|
115
196
|
const [actionButtonSchema, setActionButtonSchema] = useState([]);
|
|
@@ -199,10 +280,48 @@ const BaseModelTable = (props) => {
|
|
|
199
280
|
const [isLoading, setIsLoading] = useState(true);
|
|
200
281
|
const [error, setError] = useState("");
|
|
201
282
|
const [tableFilterError, setTableFilterError] = useState("");
|
|
283
|
+
const labelFilterConfig = useMemo(() => {
|
|
284
|
+
const filter = props.filters.find((f) => {
|
|
285
|
+
return (f.filterEntityType &&
|
|
286
|
+
f.filterEntityType.name === "Label" &&
|
|
287
|
+
f.field &&
|
|
288
|
+
f.filterDropdownField);
|
|
289
|
+
});
|
|
290
|
+
if (!filter || !filter.field || !filter.filterDropdownField) {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
const fieldKey = Object.keys(filter.field)[0];
|
|
294
|
+
if (!fieldKey) {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
fieldKey,
|
|
299
|
+
entityType: filter.filterEntityType,
|
|
300
|
+
fetchQuery: filter.filterQuery || {},
|
|
301
|
+
labelField: filter.filterDropdownField.label,
|
|
302
|
+
};
|
|
303
|
+
}, [props.filters]);
|
|
304
|
+
/*
|
|
305
|
+
* The label chips are a feature of the in-search Label filter, so a table
|
|
306
|
+
* without one has to ignore the URL's `labels` slice entirely.
|
|
307
|
+
*
|
|
308
|
+
* Tables that have since moved Labels out to a facet chip (Monitors,
|
|
309
|
+
* Network Devices) still receive `labels` from older shared/bookmarked
|
|
310
|
+
* links. Seeding those ids anyway produced a chip the table could neither
|
|
311
|
+
* name (`availableLabels` is only fetched when there *is* a config) nor
|
|
312
|
+
* apply (`buildSearchQueryFragment` skips the constraint for the same
|
|
313
|
+
* reason): a force-expanded search box with a raw-UUID pill sitting above a
|
|
314
|
+
* completely unfiltered list, re-persisted on every write until the user
|
|
315
|
+
* clicked its ×. Dropping it here also means the next view write omits the
|
|
316
|
+
* key, so the URL heals itself.
|
|
317
|
+
*/
|
|
318
|
+
const restoredLabelIds = labelFilterConfig
|
|
319
|
+
? initialUrlState.view.labels || []
|
|
320
|
+
: [];
|
|
202
321
|
const [searchText, setSearchText] = useState(initialUrlState.view.search || "");
|
|
203
322
|
const [debouncedSearchText, setDebouncedSearchText] = useState(initialUrlState.view.search || "");
|
|
204
323
|
const [isSearchFocused, setIsSearchFocused] = useState(false);
|
|
205
|
-
const [isSearchExpanded, setIsSearchExpanded] = useState(Boolean(initialUrlState.view.search ||
|
|
324
|
+
const [isSearchExpanded, setIsSearchExpanded] = useState(Boolean(initialUrlState.view.search || restoredLabelIds.length));
|
|
206
325
|
const searchInputRef = React.useRef(null);
|
|
207
326
|
const [availableLabels, setAvailableLabels] = useState([]);
|
|
208
327
|
/*
|
|
@@ -211,7 +330,7 @@ const BaseModelTable = (props) => {
|
|
|
211
330
|
* are filled in by the hydration effect below once the label list loads.
|
|
212
331
|
*/
|
|
213
332
|
const [selectedLabels, setSelectedLabels] = useState(() => {
|
|
214
|
-
return
|
|
333
|
+
return restoredLabelIds.map((id) => {
|
|
215
334
|
return { id: id, name: id, color: "#94a3b8" };
|
|
216
335
|
});
|
|
217
336
|
});
|
|
@@ -294,27 +413,24 @@ const BaseModelTable = (props) => {
|
|
|
294
413
|
// reset to first page whenever the active search term or labels change
|
|
295
414
|
setCurrentPageNumber(1);
|
|
296
415
|
}, [debouncedSearchText, selectedLabelIdsKey]);
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
if (
|
|
305
|
-
return
|
|
306
|
-
}
|
|
307
|
-
const fieldKey = Object.keys(filter.field)[0];
|
|
308
|
-
if (!fieldKey) {
|
|
309
|
-
return null;
|
|
416
|
+
/*
|
|
417
|
+
* `props.filters` is not frozen — a page can rebuild it after mount, and
|
|
418
|
+
* that is exactly how a Labels filter leaves the popup for the facet bar.
|
|
419
|
+
* Chips left over from a config that no longer exists are unnameable and
|
|
420
|
+
* unappliable, so drop them here too rather than only at mount.
|
|
421
|
+
*/
|
|
422
|
+
useEffect(() => {
|
|
423
|
+
if (labelFilterConfig) {
|
|
424
|
+
return;
|
|
310
425
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
426
|
+
setSelectedLabels((existing) => {
|
|
427
|
+
/*
|
|
428
|
+
* Same array when there is nothing to clear, so this costs an idle table
|
|
429
|
+
* no re-render.
|
|
430
|
+
*/
|
|
431
|
+
return existing.length === 0 ? existing : [];
|
|
432
|
+
});
|
|
433
|
+
}, [labelFilterConfig]);
|
|
318
434
|
// Fetch labels on first search expansion if this resource supports them.
|
|
319
435
|
useEffect(() => {
|
|
320
436
|
if (!isSearchExpanded || !labelFilterConfig || labelsFetched) {
|
|
@@ -496,8 +612,11 @@ const BaseModelTable = (props) => {
|
|
|
496
612
|
}
|
|
497
613
|
}, [tableColumns]);
|
|
498
614
|
const getRelationSelect = () => {
|
|
615
|
+
/*
|
|
616
|
+
* Deliberately the *unfiltered* column set. See getSelect() below.
|
|
617
|
+
*/
|
|
499
618
|
return getRelationSelectFromColumns({
|
|
500
|
-
columns:
|
|
619
|
+
columns: allColumns,
|
|
501
620
|
model: model,
|
|
502
621
|
});
|
|
503
622
|
};
|
|
@@ -530,7 +649,21 @@ const BaseModelTable = (props) => {
|
|
|
530
649
|
selectFields = props.callbacks.addSlugToSelect(selectFields);
|
|
531
650
|
const userPermissions = getUserPermissions();
|
|
532
651
|
const accessControl = model.getColumnAccessControlForAllColumns();
|
|
533
|
-
|
|
652
|
+
/*
|
|
653
|
+
* The viewer's layout is applied to the *input* of this loop, never to
|
|
654
|
+
* the finished array: the Actions column is appended below and has to
|
|
655
|
+
* stay last, and it is generated rather than declared, so it is not the
|
|
656
|
+
* viewer's to move or switch off.
|
|
657
|
+
*/
|
|
658
|
+
const columnsToRender = applyColumnPreference({
|
|
659
|
+
columns: allColumns,
|
|
660
|
+
preference: effectiveColumnPreference,
|
|
661
|
+
});
|
|
662
|
+
const columnIdByColumn = new Map();
|
|
663
|
+
allColumns.forEach((column, index) => {
|
|
664
|
+
columnIdByColumn.set(column, allColumnIds[index]);
|
|
665
|
+
});
|
|
666
|
+
for (const column of columnsToRender) {
|
|
534
667
|
const hasPermission = hasPermissionToReadColumn(column) || User.isMasterAdmin();
|
|
535
668
|
const key = getColumnKey(column);
|
|
536
669
|
if (hasPermission) {
|
|
@@ -550,7 +683,7 @@ const BaseModelTable = (props) => {
|
|
|
550
683
|
"." +
|
|
551
684
|
column.selectedProperty)
|
|
552
685
|
: key;
|
|
553
|
-
columns.push(Object.assign(Object.assign({}, column), { disableSort: column.disableSort || shouldDisableSort(key), key: columnKey,
|
|
686
|
+
columns.push(Object.assign(Object.assign({}, column), { id: columnIdByColumn.get(column), disableSort: column.disableSort || shouldDisableSort(key), key: columnKey,
|
|
554
687
|
/*
|
|
555
688
|
* `key` is only the first declared field, so a cell composed from
|
|
556
689
|
* several of them would export just that one. Hand the exporter
|
|
@@ -1065,13 +1198,35 @@ const BaseModelTable = (props) => {
|
|
|
1065
1198
|
});
|
|
1066
1199
|
}, []);
|
|
1067
1200
|
const getSelect = () => {
|
|
1201
|
+
/*
|
|
1202
|
+
* Every declared column, including the ones the viewer has switched off.
|
|
1203
|
+
*
|
|
1204
|
+
* Hiding must not narrow the request. A column's `getElement` is arbitrary
|
|
1205
|
+
* caller code that can read any field on the row — a "Status" cell that
|
|
1206
|
+
* also reads `currentMonitorStatus`, say — so dropping a hidden column's
|
|
1207
|
+
* fields from the select would silently blank a *different*, visible cell,
|
|
1208
|
+
* and there is no way to detect that statically. The sort field is
|
|
1209
|
+
* likewise independent of what is on screen. The cost is a few unused
|
|
1210
|
+
* fields on the wire.
|
|
1211
|
+
*/
|
|
1068
1212
|
const selectFields = getSelectFromColumns({
|
|
1069
|
-
columns:
|
|
1213
|
+
columns: allColumns,
|
|
1070
1214
|
model: model,
|
|
1071
1215
|
hasPermissionToReadField: (field) => {
|
|
1072
1216
|
return hasPermissionToReadField(field);
|
|
1073
1217
|
},
|
|
1074
1218
|
});
|
|
1219
|
+
/*
|
|
1220
|
+
* Custom field columns arrive asynchronously, but the table does not
|
|
1221
|
+
* refetch when its column set changes — so the JSON column that backs
|
|
1222
|
+
* every one of them is selected up front, off the synchronous prop, and
|
|
1223
|
+
* the values are there the moment the definitions land.
|
|
1224
|
+
*/
|
|
1225
|
+
if (props.customFieldsModelType &&
|
|
1226
|
+
model.hasColumn(CustomFieldsColumnKey) &&
|
|
1227
|
+
hasPermissionToReadField(CustomFieldsColumnKey)) {
|
|
1228
|
+
selectFields[CustomFieldsColumnKey] = true;
|
|
1229
|
+
}
|
|
1075
1230
|
const selectMoreFields = props.selectMoreFields
|
|
1076
1231
|
? Object.keys(props.selectMoreFields)
|
|
1077
1232
|
: [];
|
|
@@ -1102,7 +1257,7 @@ const BaseModelTable = (props) => {
|
|
|
1102
1257
|
return React.createElement(React.Fragment, null);
|
|
1103
1258
|
}
|
|
1104
1259
|
if (props.saveFilterProps && props.saveFilterProps.tableId) {
|
|
1105
|
-
return (React.createElement(TableViewElement, { tableId: props.saveFilterProps.tableId, tableView: tableView, currentQuery: query, currentSortBy: sortBy, currentItemsOnPage: itemsOnPage, currentSortOrder: sortOrder, currentFacetState: props.currentFacetState, onViewChange: async (tableView) => {
|
|
1260
|
+
return (React.createElement(TableViewElement, { tableId: props.saveFilterProps.tableId, tableView: tableView, currentQuery: query, currentSortBy: sortBy, currentItemsOnPage: itemsOnPage, currentSortOrder: sortOrder, currentFacetState: props.currentFacetState, currentColumns: columnPreferenceToJSON(effectiveColumnPreference) || undefined, onViewChange: async (tableView) => {
|
|
1106
1261
|
var _a;
|
|
1107
1262
|
setTableView(tableView);
|
|
1108
1263
|
if (tableView) {
|
|
@@ -1128,6 +1283,15 @@ const BaseModelTable = (props) => {
|
|
|
1128
1283
|
if (props.onFacetStateRestored) {
|
|
1129
1284
|
props.onFacetStateRestored(tableView.facets || null);
|
|
1130
1285
|
}
|
|
1286
|
+
/*
|
|
1287
|
+
* A saved view carries the columns it was saved with. Views
|
|
1288
|
+
* created before this existed have none, which restores the
|
|
1289
|
+
* table's default layout rather than leaving the previous
|
|
1290
|
+
* view's columns in place.
|
|
1291
|
+
*/
|
|
1292
|
+
if (isColumnCustomizationEnabled) {
|
|
1293
|
+
saveColumnPreference(columnPreferenceFromJSON(tableView.columns || null));
|
|
1294
|
+
}
|
|
1131
1295
|
}
|
|
1132
1296
|
else {
|
|
1133
1297
|
setQuery({});
|
|
@@ -1145,6 +1309,12 @@ const BaseModelTable = (props) => {
|
|
|
1145
1309
|
if (props.onFacetStateRestored) {
|
|
1146
1310
|
props.onFacetStateRestored(null);
|
|
1147
1311
|
}
|
|
1312
|
+
/*
|
|
1313
|
+
* Columns are deliberately left alone here. Clearing a saved
|
|
1314
|
+
* view means "stop filtering like that", not "throw away the
|
|
1315
|
+
* column layout I built" - which the viewer may well have set
|
|
1316
|
+
* up long before this view existed.
|
|
1317
|
+
*/
|
|
1148
1318
|
}
|
|
1149
1319
|
} }));
|
|
1150
1320
|
}
|
|
@@ -1252,6 +1422,22 @@ const BaseModelTable = (props) => {
|
|
|
1252
1422
|
icon: IconProp.Filter,
|
|
1253
1423
|
});
|
|
1254
1424
|
}
|
|
1425
|
+
/*
|
|
1426
|
+
* Only worth offering once there is a choice to make. A single-column
|
|
1427
|
+
* table has nothing to hide and nothing to reorder.
|
|
1428
|
+
*/
|
|
1429
|
+
if (isColumnCustomizationEnabled && allColumns.length > 1) {
|
|
1430
|
+
headerbuttons.push({
|
|
1431
|
+
title: "",
|
|
1432
|
+
buttonStyle: ButtonStyleType.ICON,
|
|
1433
|
+
buttonSize: ButtonSize.Small,
|
|
1434
|
+
className: "",
|
|
1435
|
+
onClick: () => {
|
|
1436
|
+
setShowColumnCustomizationModal(true);
|
|
1437
|
+
},
|
|
1438
|
+
icon: IconProp.TableCells,
|
|
1439
|
+
});
|
|
1440
|
+
}
|
|
1255
1441
|
setCardButtons(headerbuttons);
|
|
1256
1442
|
};
|
|
1257
1443
|
useEffect(() => {
|
|
@@ -1350,6 +1536,13 @@ const BaseModelTable = (props) => {
|
|
|
1350
1536
|
useEffect(() => {
|
|
1351
1537
|
serializeToTableColumns();
|
|
1352
1538
|
}, [props.columns]);
|
|
1539
|
+
/*
|
|
1540
|
+
* The viewer changed their layout, or the project's custom field
|
|
1541
|
+
* definitions finally arrived.
|
|
1542
|
+
*/
|
|
1543
|
+
useEffect(() => {
|
|
1544
|
+
serializeToTableColumns();
|
|
1545
|
+
}, [effectiveColumnPreference, customFieldColumns.columns]);
|
|
1353
1546
|
const setActionSchema = () => {
|
|
1354
1547
|
const permissions = PermissionUtil.getAllPermissions();
|
|
1355
1548
|
const actionsSchema = [];
|
|
@@ -1892,17 +2085,18 @@ const BaseModelTable = (props) => {
|
|
|
1892
2085
|
}, role: "presentation" },
|
|
1893
2086
|
React.createElement(Icon, { icon: IconProp.Search, className: `h-4 w-4 flex-none transition-colors duration-200 ${iconColorClass}` }),
|
|
1894
2087
|
React.createElement("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-1.5" },
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
React.createElement("span", { className: "
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
2088
|
+
hasLabelSupport &&
|
|
2089
|
+
selectedLabels.map((label) => {
|
|
2090
|
+
return (React.createElement("span", { key: label.id, className: "inline-flex items-center gap-1 rounded-full bg-gray-50 py-0.5 pl-2 pr-1 text-xs font-medium text-gray-700 ring-1 ring-inset ring-gray-200 transition-all hover:bg-gray-100", title: `Label: ${label.name}` },
|
|
2091
|
+
React.createElement("span", { className: "h-2 w-2 flex-none rounded-full", style: { backgroundColor: label.color }, "aria-hidden": "true" }),
|
|
2092
|
+
React.createElement("span", { className: "max-w-[8rem] truncate" }, label.name),
|
|
2093
|
+
React.createElement("button", { type: "button", onMouseDown: (e) => {
|
|
2094
|
+
e.preventDefault();
|
|
2095
|
+
}, onClick: () => {
|
|
2096
|
+
removeLabel(label.id);
|
|
2097
|
+
}, title: "Remove label", "aria-label": `Remove ${label.name}`, className: "ml-0.5 flex-none rounded-full p-0.5 text-gray-400 transition-colors hover:bg-gray-200 hover:text-gray-700" },
|
|
2098
|
+
React.createElement(Icon, { icon: IconProp.Close, className: "h-3 w-3" }))));
|
|
2099
|
+
}),
|
|
1906
2100
|
React.createElement("input", { ref: searchInputRef, type: "text", value: searchText, onChange: (e) => {
|
|
1907
2101
|
setSearchText(e.target.value);
|
|
1908
2102
|
setLabelDropdownIndex(0);
|
|
@@ -2091,6 +2285,8 @@ const BaseModelTable = (props) => {
|
|
|
2091
2285
|
return "Watch Demo";
|
|
2092
2286
|
case IconProp.Search:
|
|
2093
2287
|
return "Search";
|
|
2288
|
+
case IconProp.TableCells:
|
|
2289
|
+
return "Columns";
|
|
2094
2290
|
default:
|
|
2095
2291
|
return "Action";
|
|
2096
2292
|
}
|
|
@@ -2186,6 +2382,77 @@ const BaseModelTable = (props) => {
|
|
|
2186
2382
|
const getCardHeaderTitle = (originalTitle) => {
|
|
2187
2383
|
return originalTitle;
|
|
2188
2384
|
};
|
|
2385
|
+
/*
|
|
2386
|
+
* A column the viewer cannot read is left out of the picker entirely.
|
|
2387
|
+
* Listing it would advertise a field they have no access to, and switching
|
|
2388
|
+
* it on would put that field in the select — which the API rejects for the
|
|
2389
|
+
* whole request, blanking the table.
|
|
2390
|
+
*/
|
|
2391
|
+
const isPickableColumn = (column) => {
|
|
2392
|
+
if (column.isNotCustomizable) {
|
|
2393
|
+
return false;
|
|
2394
|
+
}
|
|
2395
|
+
return hasPermissionToReadColumn(column) || User.isMasterAdmin();
|
|
2396
|
+
};
|
|
2397
|
+
const getPickerEntries = (preference) => {
|
|
2398
|
+
return getCustomizableColumns({
|
|
2399
|
+
columns: allColumns,
|
|
2400
|
+
preference: preference,
|
|
2401
|
+
}).filter((entry) => {
|
|
2402
|
+
return isPickableColumn(entry.column);
|
|
2403
|
+
});
|
|
2404
|
+
};
|
|
2405
|
+
// Mirrors how serializeToTableColumns derives the key the header sorts on.
|
|
2406
|
+
const getColumnSortKey = (column) => {
|
|
2407
|
+
const key = getColumnKey(column);
|
|
2408
|
+
if (!key) {
|
|
2409
|
+
return null;
|
|
2410
|
+
}
|
|
2411
|
+
return column.selectedProperty
|
|
2412
|
+
? `${String(key)}.${column.selectedProperty}`
|
|
2413
|
+
: String(key);
|
|
2414
|
+
};
|
|
2415
|
+
const onColumnCustomizationSave = (entries) => {
|
|
2416
|
+
const preference = buildColumnPreference(entries);
|
|
2417
|
+
/*
|
|
2418
|
+
* If the layout the viewer just saved matches what the table ships with,
|
|
2419
|
+
* store nothing. Otherwise every table anyone ever opened the picker on
|
|
2420
|
+
* would be pinned to the column set of the release they opened it in, and
|
|
2421
|
+
* columns added later would arrive already stale.
|
|
2422
|
+
*/
|
|
2423
|
+
const defaultPreference = buildColumnPreference(getPickerEntries(null));
|
|
2424
|
+
const isBackToDefault = JSON.stringify(preference) === JSON.stringify(defaultPreference);
|
|
2425
|
+
/*
|
|
2426
|
+
* Sorting by a column that is no longer on screen leaves the viewer with
|
|
2427
|
+
* an ordering they can neither see nor undo — there is no header left to
|
|
2428
|
+
* click. Fall back to the table's own default sort.
|
|
2429
|
+
*/
|
|
2430
|
+
if (sortBy) {
|
|
2431
|
+
const hiddenIds = new Set(preference.hidden);
|
|
2432
|
+
const isSortedColumnHidden = entries.some((entry) => {
|
|
2433
|
+
return (hiddenIds.has(entry.id) &&
|
|
2434
|
+
getColumnSortKey(entry.column) === String(sortBy));
|
|
2435
|
+
});
|
|
2436
|
+
if (isSortedColumnHidden) {
|
|
2437
|
+
setSortBy(props.sortBy || null);
|
|
2438
|
+
setSortOrder(props.sortOrder || SortOrder.Ascending);
|
|
2439
|
+
setCurrentPageNumber(1);
|
|
2440
|
+
}
|
|
2441
|
+
}
|
|
2442
|
+
saveColumnPreference(isBackToDefault ? null : preference);
|
|
2443
|
+
setShowColumnCustomizationModal(false);
|
|
2444
|
+
};
|
|
2445
|
+
const getColumnCustomizationModal = () => {
|
|
2446
|
+
if (!showColumnCustomizationModal || !isColumnCustomizationEnabled) {
|
|
2447
|
+
return null;
|
|
2448
|
+
}
|
|
2449
|
+
return (React.createElement(ColumnCustomizationModal, { columns: getPickerEntries(effectiveColumnPreference), isDefaultLayout: isEmptyColumnPreference(effectiveColumnPreference), title: tx("Customize Columns"), onSave: onColumnCustomizationSave, onReset: () => {
|
|
2450
|
+
saveColumnPreference(null);
|
|
2451
|
+
setShowColumnCustomizationModal(false);
|
|
2452
|
+
}, onClose: () => {
|
|
2453
|
+
setShowColumnCustomizationModal(false);
|
|
2454
|
+
} }));
|
|
2455
|
+
};
|
|
2189
2456
|
const getCardComponent = () => {
|
|
2190
2457
|
const headerButtons = getHeaderButtonsWithSearch();
|
|
2191
2458
|
if (showAs === ShowAs.Table || showAs === ShowAs.List) {
|
|
@@ -2193,7 +2460,7 @@ const BaseModelTable = (props) => {
|
|
|
2193
2460
|
props.cardProps && (React.createElement(Card, Object.assign({}, props.cardProps, { buttons: headerButtons, bodyClassName: showAs === ShowAs.List
|
|
2194
2461
|
? "-ml-6 -mr-6 bg-gray-50 border-top"
|
|
2195
2462
|
: "", title: getCardHeaderTitle(getCardTitle(props.cardProps.title || "")) }),
|
|
2196
|
-
tableColumns.length === 0 &&
|
|
2463
|
+
tableColumns.length === 0 && allColumns.length > 0 ? (React.createElement(ErrorMessage, { message: `You are not authorized to view this table. You need any one of these permissions: ${PermissionHelper.getPermissionTitles(model.getReadPermissions()).join(", ")}` })) : (React.createElement(React.Fragment, null)),
|
|
2197
2464
|
props.topContent || React.createElement(React.Fragment, null),
|
|
2198
2465
|
tableColumns.length > 0 && showAs === ShowAs.Table ? (getTable()) : (React.createElement(React.Fragment, null)),
|
|
2199
2466
|
tableColumns.length > 0 && showAs === ShowAs.List ? (getList()) : (React.createElement(React.Fragment, null)))),
|
|
@@ -2279,7 +2546,8 @@ const BaseModelTable = (props) => {
|
|
|
2279
2546
|
setShowHelpModal(false);
|
|
2280
2547
|
} },
|
|
2281
2548
|
React.createElement("div", { className: "p-2" },
|
|
2282
|
-
React.createElement(MarkdownViewer, { text: props.helpContent.markdown }))))
|
|
2549
|
+
React.createElement(MarkdownViewer, { text: props.helpContent.markdown })))),
|
|
2550
|
+
getColumnCustomizationModal()));
|
|
2283
2551
|
};
|
|
2284
2552
|
export default BaseModelTable;
|
|
2285
2553
|
//# sourceMappingURL=BaseModelTable.js.map
|