@oneuptime/common 12.0.5 → 12.0.6
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/AIRun.ts +33 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/User.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/UserSession.ts +2 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
- package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +25 -0
- package/Server/API/DashboardAPI.ts +176 -492
- package/Server/API/DataSourceAPI.ts +268 -0
- package/Server/API/StatusPageAPI.ts +11 -1
- package/Server/API/UserAPI.ts +119 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Queue.ts +26 -0
- package/Server/Infrastructure/QueueWorker.ts +17 -0
- package/Server/Middleware/TelemetryIngest.ts +8 -3
- package/Server/Services/AIInsightService.ts +132 -12
- package/Server/Services/AIRunService.ts +34 -0
- package/Server/Services/AIService.ts +17 -2
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +8 -4
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +49 -0
- package/Server/Services/MonitorStatusService.ts +166 -0
- package/Server/Services/OpenTelemetryIngestService.ts +255 -184
- package/Server/Services/RumSessionPinService.ts +7 -21
- package/Server/Services/StatusPageSubscriberService.ts +13 -0
- package/Server/Services/UserService.ts +280 -9
- package/Server/Static/Vendor/README.md +62 -0
- package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
- package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
- package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
- package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
- package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
- package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
- package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
- package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
- package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
- package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
- package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
- package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
- package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
- package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
- package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
- package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
- package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
- package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
- package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
- package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
- package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
- package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
- package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
- package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
- package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
- package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
- package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
- package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
- package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
- package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
- package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
- package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
- package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
- package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
- package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
- package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
- package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
- package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
- package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
- package/Server/Utils/DataSource/EgressGuard.ts +446 -0
- package/Server/Utils/DataSource/HttpFetch.ts +221 -0
- package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
- package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
- package/Server/Utils/DataSource/Types.ts +93 -0
- package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
- package/Server/Utils/InProcessMemo.ts +141 -0
- package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
- package/Server/Utils/Monitor/MonitorResource.ts +14 -0
- package/Server/Utils/Response.ts +12 -1
- package/Server/Utils/SSRFProtection.ts +237 -0
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
- package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
- package/Server/Utils/Telemetry/Telemetry.ts +112 -1
- package/Server/Utils/Telemetry.ts +104 -3
- package/Server/Utils/VendorAssets.ts +165 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
- package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
- package/Server/Views/Partials/Head.ejs +21 -7
- package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
- package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
- package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
- package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
- package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
- package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
- package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
- package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
- package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
- package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
- package/Tests/Server/Services/AIInsightService.test.ts +266 -11
- package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
- package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
- package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
- package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
- package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
- package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
- package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
- package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
- package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
- package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
- package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
- package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
- package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
- package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
- package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
- package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
- package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
- package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
- package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
- package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
- package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
- package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
- package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
- package/Tests/Server/Utils/Telemetry.test.ts +87 -0
- package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
- package/Tests/Server/Views/OfflineRender.test.ts +297 -0
- package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
- package/Tests/Types/Password.test.ts +363 -0
- package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
- package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
- package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
- package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
- package/Types/AI/AIInsightEvidence.ts +6 -0
- package/Types/Analytics/RevenueEvent.ts +31 -0
- package/Types/Dashboard/DashboardComponentType.ts +31 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
- package/Types/DataSource/DataSourceLimits.ts +62 -0
- package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
- package/Types/DataSource/DataSourceTableResult.ts +38 -0
- package/Types/DataSource/DataSourceType.ts +213 -0
- package/Types/Date.ts +43 -3
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +46 -0
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +459 -108
- package/UI/Components/Icon/Icon.tsx +10 -9
- package/UI/Components/Modal/ConfirmModal.tsx +6 -1
- package/UI/Components/Modal/Modal.tsx +267 -35
- package/UI/Components/Modal/ModalFooter.tsx +6 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
- package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
- package/UI/Components/StatusPage/ResourceList.tsx +570 -0
- package/UI/Styles/Theme.css +18 -0
- package/UI/Utils/API/RequestOptions.ts +7 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/esbuild-config.js +45 -0
- package/Utils/Analytics.ts +15 -0
- package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
- package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
- package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
- package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/ResourceExplorer.ts +853 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
- package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +2 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +34 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +119 -433
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DataSourceAPI.js +173 -0
- package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +11 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +94 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.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/Infrastructure/Queue.js +27 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +110 -10
- package/build/dist/Server/Services/AIInsightService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +34 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +16 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +28 -35
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DataSourceService.js +159 -0
- package/build/dist/Server/Services/DataSourceService.js.map +1 -0
- package/build/dist/Server/Services/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +35 -24
- package/build/dist/Server/Services/IncidentService.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/MonitorService.js +45 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +129 -0
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +7 -15
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +241 -10
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Types.js +2 -0
- package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/InProcessMemo.js +113 -0
- package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +9 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +192 -0
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +93 -6
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +121 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceType.js +183 -0
- package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
- package/build/dist/Types/Date.js +38 -3
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserAuthenticationStatus.js +2 -0
- package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
- package/build/dist/UI/Components/ErrorBoundary.js +388 -72
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +10 -4
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +178 -19
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TestDataSource.js +39 -0
- package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
- package/build/dist/Utils/Analytics.js +4 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
- package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +5 -1
- package/tsconfig.json +12 -10
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
import StatusPageResource from "../../../Models/DatabaseModels/StatusPageResource";
|
|
2
|
+
import IconProp from "../../../Types/Icon/IconProp";
|
|
3
|
+
import StatusPageResourceExplorerUtil from "../../../Utils/StatusPage/ResourceExplorer";
|
|
4
|
+
import Button, { ButtonSize, ButtonStyleType } from "../Button/Button";
|
|
5
|
+
import Icon from "../Icon/Icon";
|
|
6
|
+
import MoreMenu from "../MoreMenu/MoreMenu";
|
|
7
|
+
import MoreMenuItem from "../MoreMenu/MoreMenuItem";
|
|
8
|
+
import React, { FunctionComponent, ReactElement } from "react";
|
|
9
|
+
import {
|
|
10
|
+
DragDropContext,
|
|
11
|
+
Draggable,
|
|
12
|
+
DraggableProvided,
|
|
13
|
+
DraggableStateSnapshot,
|
|
14
|
+
DropResult,
|
|
15
|
+
Droppable,
|
|
16
|
+
DroppableProvided,
|
|
17
|
+
} from "react-beautiful-dnd";
|
|
18
|
+
|
|
19
|
+
export interface ComponentProps {
|
|
20
|
+
statusPageResources: Array<StatusPageResource>;
|
|
21
|
+
/*
|
|
22
|
+
* Distinguishes this list's drag scope from any other on the page. Two
|
|
23
|
+
* droppables sharing an id would let a row be dropped into the wrong one.
|
|
24
|
+
*/
|
|
25
|
+
listKey: string;
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* How a resource's monitor is drawn. The monitor element lives in the
|
|
29
|
+
* dashboard - it links through to the monitor and knows about project
|
|
30
|
+
* routing - and this component is in Common, so the caller hands it in.
|
|
31
|
+
*/
|
|
32
|
+
getResourceElement: (statusPageResource: StatusPageResource) => ReactElement;
|
|
33
|
+
|
|
34
|
+
isEditable: boolean;
|
|
35
|
+
isDeleteable: boolean;
|
|
36
|
+
/*
|
|
37
|
+
* False while a filter is on. The order a drag writes is "take the place of
|
|
38
|
+
* the row you were dropped on", and in a filtered list the row above is not
|
|
39
|
+
* the row above - so the reorder is offered only over the whole list.
|
|
40
|
+
*/
|
|
41
|
+
isReorderable: boolean;
|
|
42
|
+
|
|
43
|
+
onEdit: (statusPageResource: StatusPageResource) => void;
|
|
44
|
+
onDelete: (statusPageResource: StatusPageResource) => void;
|
|
45
|
+
onShowId: (statusPageResource: StatusPageResource) => void;
|
|
46
|
+
/*
|
|
47
|
+
* From and to are positions in the list as drawn. The caller turns them into
|
|
48
|
+
* the one write the server understands.
|
|
49
|
+
*/
|
|
50
|
+
onReorder: (fromIndex: number, toIndex: number) => void;
|
|
51
|
+
|
|
52
|
+
/* The row whose write is in flight; its actions are disabled while it is. */
|
|
53
|
+
busyResourceId?: string | null | undefined;
|
|
54
|
+
|
|
55
|
+
/* Rows past this are held back behind "Show more". */
|
|
56
|
+
visibleCount: number;
|
|
57
|
+
onShowMore: () => void;
|
|
58
|
+
|
|
59
|
+
emptyState: ReactElement;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* The resources of one status page group, as the list they are.
|
|
64
|
+
*
|
|
65
|
+
* This used to be a ModelTable, mounted inside a row of a tree of other groups:
|
|
66
|
+
* a card with its own title, description, create button and overflow menu, a
|
|
67
|
+
* checkbox column, a sortable header and a pagination footer, all to show two
|
|
68
|
+
* columns of at most a few dozen rows. Everything about that chrome was a
|
|
69
|
+
* second, competing frame around content that was already inside one, and the
|
|
70
|
+
* deeper the group sat the more it read as a page inside a page.
|
|
71
|
+
*
|
|
72
|
+
* What is actually being edited here is a short ordered list, and the order is
|
|
73
|
+
* the point - it is the order visitors see. So it is drawn as an ordered list
|
|
74
|
+
* with a grip on each row, and everything else (creating, filtering, the group
|
|
75
|
+
* this belongs to) lives once, in the pane header above it.
|
|
76
|
+
*
|
|
77
|
+
* It is drawn in columns rather than as free floating rows. A dashboard pane is
|
|
78
|
+
* as wide as the window, and a row holding one short name on the left and two
|
|
79
|
+
* icons on the right leaves a metre of empty white between the thing and the
|
|
80
|
+
* buttons that act on it - which is both ugly and a long way for the eye to
|
|
81
|
+
* travel. So the row carries what an operator actually wants to compare down
|
|
82
|
+
* the column: the position visitors see it in, the monitor, and the name it is
|
|
83
|
+
* published under.
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* One set of column widths, used by the header and by every row, so the two
|
|
88
|
+
* cannot drift apart. The published-name column takes the whole row on a phone
|
|
89
|
+
* (basis-full) and shares the width from sm up, which keeps it a single element
|
|
90
|
+
* rather than one copy per breakpoint.
|
|
91
|
+
*/
|
|
92
|
+
const GRIP_COLUMN_CLASS_NAME: string = "w-5 flex-shrink-0";
|
|
93
|
+
/*
|
|
94
|
+
* Held back on a phone, where 24px of number costs a fifth of what is left for
|
|
95
|
+
* the monitor's name and the rows are already in the order it describes.
|
|
96
|
+
*/
|
|
97
|
+
const POSITION_COLUMN_CLASS_NAME: string =
|
|
98
|
+
"hidden w-6 flex-shrink-0 text-right text-xs tabular-nums sm:block";
|
|
99
|
+
const MONITOR_COLUMN_CLASS_NAME: string = "min-w-0 flex-[2_1_0%]";
|
|
100
|
+
/*
|
|
101
|
+
* Its own line on a phone, indented to sit under the monitor it renames rather
|
|
102
|
+
* than out beneath the grip; beside the monitor from sm up.
|
|
103
|
+
*
|
|
104
|
+
* order-last is what keeps the row's buttons up on the first line with the
|
|
105
|
+
* monitor: a full width column wraps everything after it, and the buttons are
|
|
106
|
+
* after it in the markup because that is the order they are read in.
|
|
107
|
+
*/
|
|
108
|
+
const PUBLISHED_NAME_COLUMN_CLASS_NAME: string =
|
|
109
|
+
"order-last min-w-0 flex-[3_1_100%] pl-8 sm:order-none sm:flex-[3_1_0%] sm:pl-0";
|
|
110
|
+
const ACTIONS_COLUMN_CLASS_NAME: string =
|
|
111
|
+
"flex w-[3.75rem] flex-shrink-0 items-center justify-end gap-0.5";
|
|
112
|
+
|
|
113
|
+
const ROW_CLASS_NAME: string =
|
|
114
|
+
"group flex flex-wrap items-center gap-x-3 gap-y-1 px-4 py-3 transition-colors";
|
|
115
|
+
const ResourceList: FunctionComponent<ComponentProps> = (
|
|
116
|
+
props: ComponentProps,
|
|
117
|
+
): ReactElement => {
|
|
118
|
+
const visibleResources: Array<StatusPageResource> =
|
|
119
|
+
props.statusPageResources.slice(0, props.visibleCount);
|
|
120
|
+
|
|
121
|
+
const hiddenCount: number =
|
|
122
|
+
props.statusPageResources.length - visibleResources.length;
|
|
123
|
+
|
|
124
|
+
type RenderActionsFunction = (
|
|
125
|
+
statusPageResource: StatusPageResource,
|
|
126
|
+
index: number,
|
|
127
|
+
) => ReactElement;
|
|
128
|
+
|
|
129
|
+
const renderActions: RenderActionsFunction = (
|
|
130
|
+
statusPageResource: StatusPageResource,
|
|
131
|
+
index: number,
|
|
132
|
+
): ReactElement => {
|
|
133
|
+
const resourceId: string = statusPageResource._id?.toString() || "";
|
|
134
|
+
const isBusy: boolean = props.busyResourceId === resourceId;
|
|
135
|
+
const name: string =
|
|
136
|
+
StatusPageResourceExplorerUtil.getResourceName(statusPageResource);
|
|
137
|
+
|
|
138
|
+
const menuItems: Array<ReactElement> = [];
|
|
139
|
+
|
|
140
|
+
if (props.isReorderable) {
|
|
141
|
+
/*
|
|
142
|
+
* The same move a drag makes, reachable from the keyboard and from a
|
|
143
|
+
* touch screen - neither of which has anywhere to drag to.
|
|
144
|
+
*/
|
|
145
|
+
menuItems.push(
|
|
146
|
+
<MoreMenuItem
|
|
147
|
+
key="move-up"
|
|
148
|
+
text="Move up"
|
|
149
|
+
icon={IconProp.ArrowUp}
|
|
150
|
+
isDisabled={isBusy || index === 0}
|
|
151
|
+
onClick={() => {
|
|
152
|
+
props.onReorder(index, index - 1);
|
|
153
|
+
}}
|
|
154
|
+
/>,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
menuItems.push(
|
|
158
|
+
<MoreMenuItem
|
|
159
|
+
key="move-down"
|
|
160
|
+
text="Move down"
|
|
161
|
+
icon={IconProp.ArrowDown}
|
|
162
|
+
isDisabled={isBusy || index === props.statusPageResources.length - 1}
|
|
163
|
+
onClick={() => {
|
|
164
|
+
props.onReorder(index, index + 1);
|
|
165
|
+
}}
|
|
166
|
+
/>,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
menuItems.push(
|
|
171
|
+
<MoreMenuItem
|
|
172
|
+
key="show-id"
|
|
173
|
+
text="Show ID"
|
|
174
|
+
icon={IconProp.Info}
|
|
175
|
+
onClick={() => {
|
|
176
|
+
props.onShowId(statusPageResource);
|
|
177
|
+
}}
|
|
178
|
+
/>,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
if (props.isDeleteable) {
|
|
182
|
+
menuItems.push(
|
|
183
|
+
<MoreMenuItem
|
|
184
|
+
key="delete"
|
|
185
|
+
text="Remove from status page"
|
|
186
|
+
icon={IconProp.Trash}
|
|
187
|
+
className="text-red-600 enabled:hover:bg-red-50 enabled:hover:text-red-700"
|
|
188
|
+
iconClassName="text-red-400 group-hover:text-red-500"
|
|
189
|
+
isDisabled={isBusy}
|
|
190
|
+
onClick={() => {
|
|
191
|
+
props.onDelete(statusPageResource);
|
|
192
|
+
}}
|
|
193
|
+
/>,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<div
|
|
199
|
+
className={ACTIONS_COLUMN_CLASS_NAME}
|
|
200
|
+
data-testid="status-page-resource-row-actions"
|
|
201
|
+
>
|
|
202
|
+
{props.isEditable ? (
|
|
203
|
+
<Button
|
|
204
|
+
buttonSize={ButtonSize.Small}
|
|
205
|
+
buttonStyle={ButtonStyleType.ICON}
|
|
206
|
+
icon={IconProp.Edit}
|
|
207
|
+
title=""
|
|
208
|
+
tooltip="Edit this resource"
|
|
209
|
+
ariaLabel={`Edit ${name}`}
|
|
210
|
+
dataTestId="status-page-resource-row-edit"
|
|
211
|
+
disabled={isBusy}
|
|
212
|
+
className="text-gray-400 hover:bg-gray-200 hover:text-gray-700"
|
|
213
|
+
onClick={() => {
|
|
214
|
+
props.onEdit(statusPageResource);
|
|
215
|
+
}}
|
|
216
|
+
/>
|
|
217
|
+
) : (
|
|
218
|
+
<></>
|
|
219
|
+
)}
|
|
220
|
+
|
|
221
|
+
<MoreMenu
|
|
222
|
+
text={`More actions for ${name}`}
|
|
223
|
+
menuIcon={IconProp.EllipsisHorizontal}
|
|
224
|
+
isDisabled={isBusy}
|
|
225
|
+
elementToBeShownInsteadOfButton={
|
|
226
|
+
<button
|
|
227
|
+
type="button"
|
|
228
|
+
aria-label={`More actions for ${name}`}
|
|
229
|
+
data-testid="status-page-resource-row-more"
|
|
230
|
+
className="flex h-7 w-7 items-center justify-center rounded-md text-gray-400 transition-colors hover:bg-gray-200 hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400"
|
|
231
|
+
>
|
|
232
|
+
<Icon icon={IconProp.EllipsisHorizontal} className="h-5 w-5" />
|
|
233
|
+
</button>
|
|
234
|
+
}
|
|
235
|
+
>
|
|
236
|
+
{menuItems}
|
|
237
|
+
</MoreMenu>
|
|
238
|
+
</div>
|
|
239
|
+
);
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
type RenderRowBodyFunction = (
|
|
243
|
+
statusPageResource: StatusPageResource,
|
|
244
|
+
index: number,
|
|
245
|
+
dragHandle: ReactElement,
|
|
246
|
+
) => ReactElement;
|
|
247
|
+
|
|
248
|
+
const renderRowBody: RenderRowBodyFunction = (
|
|
249
|
+
statusPageResource: StatusPageResource,
|
|
250
|
+
index: number,
|
|
251
|
+
dragHandle: ReactElement,
|
|
252
|
+
): ReactElement => {
|
|
253
|
+
const monitorName: string =
|
|
254
|
+
StatusPageResourceExplorerUtil.getResourceName(statusPageResource);
|
|
255
|
+
const displayName: string = statusPageResource.displayName || "";
|
|
256
|
+
|
|
257
|
+
return (
|
|
258
|
+
<>
|
|
259
|
+
{dragHandle}
|
|
260
|
+
|
|
261
|
+
{/*
|
|
262
|
+
* The position visitors see this resource in. The order is the whole
|
|
263
|
+
* point of this list, and until it was numbered the only way to read it
|
|
264
|
+
* was to count rows.
|
|
265
|
+
*/}
|
|
266
|
+
<span
|
|
267
|
+
className={`${POSITION_COLUMN_CLASS_NAME} text-gray-400`}
|
|
268
|
+
aria-hidden="true"
|
|
269
|
+
data-testid="status-page-resource-row-position"
|
|
270
|
+
>
|
|
271
|
+
{index + 1}
|
|
272
|
+
</span>
|
|
273
|
+
|
|
274
|
+
<div className={MONITOR_COLUMN_CLASS_NAME}>
|
|
275
|
+
<div
|
|
276
|
+
/*
|
|
277
|
+
* The monitor element draws its name inside a flex span (it may
|
|
278
|
+
* carry an icon), and text-overflow does not reach the anonymous
|
|
279
|
+
* item a flex container makes of its text - so a long name was
|
|
280
|
+
* clipped mid-letter with no ellipsis. Laying that span out as a
|
|
281
|
+
* block puts the name back in an inline formatting context, where
|
|
282
|
+
* truncation means what it says.
|
|
283
|
+
*/
|
|
284
|
+
className="truncate text-sm font-medium text-gray-900 [&_span]:block [&_span]:truncate"
|
|
285
|
+
data-testid="status-page-resource-row-name"
|
|
286
|
+
>
|
|
287
|
+
{props.getResourceElement(statusPageResource)}
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
{/*
|
|
292
|
+
* The display name is what visitors actually read, so it gets a column
|
|
293
|
+
* of its own rather than a second line under the monitor - but only a
|
|
294
|
+
* value when it is not simply the monitor's own name repeated back.
|
|
295
|
+
*/}
|
|
296
|
+
<div className={PUBLISHED_NAME_COLUMN_CLASS_NAME}>
|
|
297
|
+
{displayName && displayName !== monitorName ? (
|
|
298
|
+
<p
|
|
299
|
+
className="truncate text-sm text-gray-500"
|
|
300
|
+
title={displayName}
|
|
301
|
+
data-testid="status-page-resource-row-display-name"
|
|
302
|
+
>
|
|
303
|
+
{displayName}
|
|
304
|
+
</p>
|
|
305
|
+
) : (
|
|
306
|
+
<p className="truncate text-sm text-gray-400">
|
|
307
|
+
Same as the monitor name
|
|
308
|
+
</p>
|
|
309
|
+
)}
|
|
310
|
+
</div>
|
|
311
|
+
|
|
312
|
+
{renderActions(statusPageResource, index)}
|
|
313
|
+
</>
|
|
314
|
+
);
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
type RenderDragHandleFunction = (
|
|
318
|
+
provided: DraggableProvided | null,
|
|
319
|
+
statusPageResource: StatusPageResource,
|
|
320
|
+
) => ReactElement;
|
|
321
|
+
|
|
322
|
+
const renderDragHandle: RenderDragHandleFunction = (
|
|
323
|
+
provided: DraggableProvided | null,
|
|
324
|
+
statusPageResource: StatusPageResource,
|
|
325
|
+
): ReactElement => {
|
|
326
|
+
if (!props.isReorderable || !provided) {
|
|
327
|
+
/*
|
|
328
|
+
* The column stays so that a filtered list does not shift sideways the
|
|
329
|
+
* moment a filter is typed.
|
|
330
|
+
*/
|
|
331
|
+
return (
|
|
332
|
+
<span className={`${GRIP_COLUMN_CLASS_NAME} h-5`} aria-hidden="true" />
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return (
|
|
337
|
+
<span
|
|
338
|
+
{...provided.dragHandleProps}
|
|
339
|
+
className={`${GRIP_COLUMN_CLASS_NAME} flex h-6 cursor-grab items-center justify-center rounded text-gray-300 transition-colors hover:bg-gray-200 hover:text-gray-600 group-hover:text-gray-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400 active:cursor-grabbing`}
|
|
340
|
+
data-testid="status-page-resource-row-drag-handle"
|
|
341
|
+
aria-label={`Reorder ${StatusPageResourceExplorerUtil.getResourceName(
|
|
342
|
+
statusPageResource,
|
|
343
|
+
)}`}
|
|
344
|
+
>
|
|
345
|
+
<Icon icon={IconProp.Drag} className="h-4 w-4" />
|
|
346
|
+
</span>
|
|
347
|
+
);
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
type GetRowClassNameFunction = (
|
|
351
|
+
isDragging: boolean,
|
|
352
|
+
isBusy: boolean,
|
|
353
|
+
isLastRow: boolean,
|
|
354
|
+
) => string;
|
|
355
|
+
|
|
356
|
+
const getRowClassName: GetRowClassNameFunction = (
|
|
357
|
+
isDragging: boolean,
|
|
358
|
+
isBusy: boolean,
|
|
359
|
+
isLastRow: boolean,
|
|
360
|
+
): string => {
|
|
361
|
+
return `${ROW_CLASS_NAME} ${
|
|
362
|
+
isDragging
|
|
363
|
+
? /*
|
|
364
|
+
* bg-indigo-50 rather than bg-indigo-50/70: the dark theme remaps the
|
|
365
|
+
* un-suffixed colour tokens and not the transparent ones, so an
|
|
366
|
+
* opacity modifier leaves a light row in a dark list.
|
|
367
|
+
*
|
|
368
|
+
* A lifted row is rounded on all four corners because it is off the
|
|
369
|
+
* list while it is being dragged; a settled one only rounds where the
|
|
370
|
+
* container does, so its hover fill cannot square off the card's own
|
|
371
|
+
* bottom corners.
|
|
372
|
+
*/
|
|
373
|
+
"rounded-xl bg-indigo-50 shadow-md ring-1 ring-indigo-200"
|
|
374
|
+
: `bg-white hover:bg-gray-50 ${isLastRow ? "rounded-b-xl" : ""}`
|
|
375
|
+
} ${isBusy ? "opacity-60" : ""}`;
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
type IsLastRowFunction = (index: number) => boolean;
|
|
379
|
+
|
|
380
|
+
/*
|
|
381
|
+
* Only the bottom row of the whole card rounds its corners, and a card that
|
|
382
|
+
* ends in a "show more" footer has no such row.
|
|
383
|
+
*/
|
|
384
|
+
const isLastRow: IsLastRowFunction = (index: number): boolean => {
|
|
385
|
+
return hiddenCount === 0 && index === visibleResources.length - 1;
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
type RenderHeaderFunction = () => ReactElement;
|
|
389
|
+
|
|
390
|
+
/*
|
|
391
|
+
* Column headings, from sm up. They are what makes the second column read as
|
|
392
|
+
* "the name visitors see" rather than as a stray subtitle, and they are the
|
|
393
|
+
* only place the position column can be explained at all.
|
|
394
|
+
*
|
|
395
|
+
* Below sm the published name wraps under the monitor instead of sitting
|
|
396
|
+
* beside it, so a header row would be labelling columns that are not there.
|
|
397
|
+
*/
|
|
398
|
+
const renderHeader: RenderHeaderFunction = (): ReactElement => {
|
|
399
|
+
return (
|
|
400
|
+
<div
|
|
401
|
+
className="hidden items-center gap-x-3 rounded-t-xl border-b border-gray-200 bg-gray-50 px-4 py-2 text-[11px] font-semibold uppercase tracking-wide text-gray-500 sm:flex"
|
|
402
|
+
data-testid="status-page-resource-list-header"
|
|
403
|
+
aria-hidden="true"
|
|
404
|
+
>
|
|
405
|
+
<span className={GRIP_COLUMN_CLASS_NAME} />
|
|
406
|
+
<span
|
|
407
|
+
className={POSITION_COLUMN_CLASS_NAME}
|
|
408
|
+
title="Position on the status page"
|
|
409
|
+
>
|
|
410
|
+
#
|
|
411
|
+
</span>
|
|
412
|
+
<span className={MONITOR_COLUMN_CLASS_NAME}>Monitor</span>
|
|
413
|
+
<span className={PUBLISHED_NAME_COLUMN_CLASS_NAME}>
|
|
414
|
+
Shown on the status page as
|
|
415
|
+
</span>
|
|
416
|
+
<span className={ACTIONS_COLUMN_CLASS_NAME} />
|
|
417
|
+
</div>
|
|
418
|
+
);
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
type RenderRowsFunction = () => ReactElement;
|
|
422
|
+
|
|
423
|
+
const renderRows: RenderRowsFunction = (): ReactElement => {
|
|
424
|
+
if (!props.isReorderable) {
|
|
425
|
+
return (
|
|
426
|
+
<div
|
|
427
|
+
className="divide-y divide-gray-100"
|
|
428
|
+
data-testid="status-page-resource-rows"
|
|
429
|
+
>
|
|
430
|
+
{visibleResources.map(
|
|
431
|
+
(statusPageResource: StatusPageResource, index: number) => {
|
|
432
|
+
const resourceId: string =
|
|
433
|
+
statusPageResource._id?.toString() || `${index}`;
|
|
434
|
+
|
|
435
|
+
return (
|
|
436
|
+
<div
|
|
437
|
+
key={resourceId}
|
|
438
|
+
data-testid="status-page-resource-row"
|
|
439
|
+
data-resource-id={resourceId}
|
|
440
|
+
className={getRowClassName(
|
|
441
|
+
false,
|
|
442
|
+
props.busyResourceId === resourceId,
|
|
443
|
+
isLastRow(index),
|
|
444
|
+
)}
|
|
445
|
+
>
|
|
446
|
+
{renderRowBody(
|
|
447
|
+
statusPageResource,
|
|
448
|
+
index,
|
|
449
|
+
renderDragHandle(null, statusPageResource),
|
|
450
|
+
)}
|
|
451
|
+
</div>
|
|
452
|
+
);
|
|
453
|
+
},
|
|
454
|
+
)}
|
|
455
|
+
</div>
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return (
|
|
460
|
+
<DragDropContext
|
|
461
|
+
onDragEnd={(result: DropResult) => {
|
|
462
|
+
if (!result.destination) {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
props.onReorder(result.source.index, result.destination.index);
|
|
467
|
+
}}
|
|
468
|
+
>
|
|
469
|
+
<Droppable droppableId={`status-page-resources-${props.listKey}`}>
|
|
470
|
+
{(droppableProvided: DroppableProvided) => {
|
|
471
|
+
return (
|
|
472
|
+
<div
|
|
473
|
+
ref={droppableProvided.innerRef}
|
|
474
|
+
{...droppableProvided.droppableProps}
|
|
475
|
+
className="divide-y divide-gray-100"
|
|
476
|
+
data-testid="status-page-resource-rows"
|
|
477
|
+
>
|
|
478
|
+
{visibleResources.map(
|
|
479
|
+
(statusPageResource: StatusPageResource, index: number) => {
|
|
480
|
+
const resourceId: string =
|
|
481
|
+
statusPageResource._id?.toString() || `${index}`;
|
|
482
|
+
|
|
483
|
+
return (
|
|
484
|
+
<Draggable
|
|
485
|
+
key={resourceId}
|
|
486
|
+
draggableId={resourceId}
|
|
487
|
+
index={index}
|
|
488
|
+
isDragDisabled={props.busyResourceId === resourceId}
|
|
489
|
+
>
|
|
490
|
+
{(
|
|
491
|
+
draggableProvided: DraggableProvided,
|
|
492
|
+
snapshot: DraggableStateSnapshot,
|
|
493
|
+
) => {
|
|
494
|
+
return (
|
|
495
|
+
<div
|
|
496
|
+
ref={draggableProvided.innerRef}
|
|
497
|
+
{...draggableProvided.draggableProps}
|
|
498
|
+
data-testid="status-page-resource-row"
|
|
499
|
+
data-resource-id={resourceId}
|
|
500
|
+
className={getRowClassName(
|
|
501
|
+
snapshot.isDragging,
|
|
502
|
+
props.busyResourceId === resourceId,
|
|
503
|
+
isLastRow(index),
|
|
504
|
+
)}
|
|
505
|
+
>
|
|
506
|
+
{renderRowBody(
|
|
507
|
+
statusPageResource,
|
|
508
|
+
index,
|
|
509
|
+
renderDragHandle(
|
|
510
|
+
draggableProvided,
|
|
511
|
+
statusPageResource,
|
|
512
|
+
),
|
|
513
|
+
)}
|
|
514
|
+
</div>
|
|
515
|
+
);
|
|
516
|
+
}}
|
|
517
|
+
</Draggable>
|
|
518
|
+
);
|
|
519
|
+
},
|
|
520
|
+
)}
|
|
521
|
+
{droppableProvided.placeholder}
|
|
522
|
+
</div>
|
|
523
|
+
);
|
|
524
|
+
}}
|
|
525
|
+
</Droppable>
|
|
526
|
+
</DragDropContext>
|
|
527
|
+
);
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
if (props.statusPageResources.length === 0) {
|
|
531
|
+
return props.emptyState;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
return (
|
|
535
|
+
<div
|
|
536
|
+
/*
|
|
537
|
+
* One bordered card around the whole list rather than a border per row.
|
|
538
|
+
* No overflow-hidden: a dragged row is moved with a transform, and a
|
|
539
|
+
* clipping ancestor would cut it off the moment it left the list.
|
|
540
|
+
*/
|
|
541
|
+
className="rounded-xl border border-gray-200 bg-white"
|
|
542
|
+
data-testid="status-page-resource-list"
|
|
543
|
+
>
|
|
544
|
+
{renderHeader()}
|
|
545
|
+
{renderRows()}
|
|
546
|
+
|
|
547
|
+
{hiddenCount > 0 ? (
|
|
548
|
+
<div
|
|
549
|
+
className="rounded-b-xl border-t border-gray-100 bg-gray-50 px-4 py-2.5 text-center [&_button]:md:ml-0"
|
|
550
|
+
data-testid="status-page-resource-list-show-more"
|
|
551
|
+
>
|
|
552
|
+
<Button
|
|
553
|
+
title={`Show ${Math.min(
|
|
554
|
+
hiddenCount,
|
|
555
|
+
StatusPageResourceExplorerUtil.ResourceRowsPerPage,
|
|
556
|
+
).toLocaleString()} more of ${hiddenCount.toLocaleString()}`}
|
|
557
|
+
icon={IconProp.ChevronDown}
|
|
558
|
+
buttonSize={ButtonSize.Small}
|
|
559
|
+
buttonStyle={ButtonStyleType.NORMAL}
|
|
560
|
+
onClick={props.onShowMore}
|
|
561
|
+
/>
|
|
562
|
+
</div>
|
|
563
|
+
) : (
|
|
564
|
+
<></>
|
|
565
|
+
)}
|
|
566
|
+
</div>
|
|
567
|
+
);
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
export default ResourceList;
|
package/UI/Styles/Theme.css
CHANGED
|
@@ -44,6 +44,13 @@
|
|
|
44
44
|
--ou-shadow-sm: 0 1px 3px rgb(15 23 42 / 8%);
|
|
45
45
|
--ou-shadow-md: 0 8px 20px -6px rgb(15 23 42 / 18%);
|
|
46
46
|
--ou-shadow-lg: 0 18px 40px -12px rgb(15 23 42 / 24%);
|
|
47
|
+
/*
|
|
48
|
+
* The colour a scrolled modal's header and footer cast over the body. Only
|
|
49
|
+
* the colour lives here: the geometry stays in the component, which repeats
|
|
50
|
+
* this value as its own fallback so the shadow survives in the apps that do
|
|
51
|
+
* not load this file.
|
|
52
|
+
*/
|
|
53
|
+
--ou-modal-scroll-shadow: rgb(15 23 42 / 35%);
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
html.dark {
|
|
@@ -89,6 +96,11 @@ html.dark {
|
|
|
89
96
|
0 0 0 1px rgb(148 163 184 / 10%);
|
|
90
97
|
--ou-shadow-lg: 0 24px 52px -14px rgb(0 0 0 / 64%),
|
|
91
98
|
0 0 0 1px rgb(148 163 184 / 12%);
|
|
99
|
+
/*
|
|
100
|
+
* Near-black at 35% is all but invisible against a dark surface, and the
|
|
101
|
+
* scroll shadow is the only thing that says a modal body has more content.
|
|
102
|
+
*/
|
|
103
|
+
--ou-modal-scroll-shadow: rgb(0 0 0 / 85%);
|
|
92
104
|
}
|
|
93
105
|
|
|
94
106
|
html.dark,
|
|
@@ -210,6 +222,12 @@ html.dark :is(
|
|
|
210
222
|
[class~="active:bg-gray-100"]
|
|
211
223
|
):hover,
|
|
212
224
|
html.dark [class~="active:bg-gray-100"]:active,
|
|
225
|
+
/*
|
|
226
|
+
* A row that gives its keyboard focus the same ground its hover gets. Without
|
|
227
|
+
* this token the light utility survives into the dark theme and paints a
|
|
228
|
+
* near-white bar across whatever it is on - see the status page group tree.
|
|
229
|
+
*/
|
|
230
|
+
html.dark [class~="focus-within:bg-gray-100"]:focus-within,
|
|
213
231
|
html.dark [class~="disabled:bg-gray-100"]:disabled {
|
|
214
232
|
background-color: var(--ou-surface-tertiary) !important;
|
|
215
233
|
}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import URL from "../../../Types/API/URL";
|
|
2
2
|
import type { RequestOptions as CoreRequestOptions } from "../../../Utils/API";
|
|
3
3
|
import Dictionary from "../../../Types/Dictionary";
|
|
4
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
4
5
|
|
|
5
6
|
export default interface RequestOptions {
|
|
6
7
|
requestHeaders?: Dictionary<string> | undefined;
|
|
7
8
|
overrideRequestUrl?: URL | undefined;
|
|
8
9
|
apiRequestOptions?: CoreRequestOptions | undefined;
|
|
10
|
+
/*
|
|
11
|
+
* Extra top-level fields merged into a list request body before the
|
|
12
|
+
* canonical query/select/sort/groupBy fields. This lets callers attach
|
|
13
|
+
* endpoint-specific context without being able to replace the list query.
|
|
14
|
+
*/
|
|
15
|
+
additionalRequestBody?: JSONObject | undefined;
|
|
9
16
|
}
|
|
@@ -292,6 +292,7 @@ export default class ModelAPI {
|
|
|
292
292
|
method: HTTPMethod.POST,
|
|
293
293
|
url: apiUrl,
|
|
294
294
|
data: {
|
|
295
|
+
...(requestOptions?.additionalRequestBody || {}),
|
|
295
296
|
query: JSONFunctions.serialize(query as JSONObject),
|
|
296
297
|
select: JSONFunctions.serialize(select as JSONObject),
|
|
297
298
|
sort: JSONFunctions.serialize(sort as JSONObject),
|
|
@@ -238,6 +238,7 @@ export default class ModelAPI {
|
|
|
238
238
|
method: HTTPMethod.POST,
|
|
239
239
|
url: apiUrl,
|
|
240
240
|
data: {
|
|
241
|
+
...(data.requestOptions?.additionalRequestBody || {}),
|
|
241
242
|
query: JSONFunctions.serialize(data.query as JSONObject),
|
|
242
243
|
select: JSONFunctions.serialize(data.select as JSONObject),
|
|
243
244
|
sort: JSONFunctions.serialize(data.sort as JSONObject),
|