@oneuptime/common 12.0.13 → 12.0.14
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/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.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/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import Icon from "../Icon/Icon";
|
|
2
|
+
import KeyboardShortcut, { KeyboardShortcutSize, KeyboardShortcutVariant, } from "../KeyboardShortcut/KeyboardShortcut";
|
|
3
|
+
import KeyboardKey from "../KeyboardShortcut/KeyboardKey";
|
|
4
|
+
import IconProp from "../../../Types/Icon/IconProp";
|
|
5
|
+
import useTranslateValue from "../../Utils/Translation";
|
|
6
|
+
import { lockPageScroll, unlockPageScroll } from "../../Utils/PageScrollLock";
|
|
7
|
+
import { filterPaletteCommands, getPaletteSectionId, normalizePaletteQuery, } from "./PaletteFilter";
|
|
8
|
+
import { readRecentCommandIds, RECENT_COMMANDS_LIMIT, writeRecentCommandId, } from "./RecentCommands";
|
|
9
|
+
import useProviderSearch from "./UseProviderSearch";
|
|
10
|
+
import PaletteRow from "./PaletteRow";
|
|
11
|
+
import React, { useEffect, useMemo, useRef, useState, } from "react";
|
|
12
|
+
import { createPortal } from "react-dom";
|
|
13
|
+
const EMPTY_PROVIDERS = [];
|
|
14
|
+
const hasPendingSection = (sections) => {
|
|
15
|
+
return sections.some((section) => {
|
|
16
|
+
return section.isPending;
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
const commandToEntry = (command, idPrefix) => {
|
|
20
|
+
return {
|
|
21
|
+
id: `${idPrefix}${command.id}`,
|
|
22
|
+
title: command.title,
|
|
23
|
+
description: command.description,
|
|
24
|
+
icon: command.icon,
|
|
25
|
+
iconColor: command.iconColor,
|
|
26
|
+
shortcut: command.shortcut,
|
|
27
|
+
recentCommandId: command.id,
|
|
28
|
+
onSelect: command.onSelect,
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
const CommandPalettePanel = (props) => {
|
|
32
|
+
const [query, setQuery] = useState("");
|
|
33
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
34
|
+
/*
|
|
35
|
+
* The panel mounts in its closed state and is flipped open one frame later
|
|
36
|
+
* so the browser has something to transition from (Modal's pattern).
|
|
37
|
+
*/
|
|
38
|
+
const [hasEntered, setHasEntered] = useState(false);
|
|
39
|
+
const inputRef = useRef(null);
|
|
40
|
+
const rowRefs = useRef([]);
|
|
41
|
+
/*
|
|
42
|
+
* Whatever had focus when the palette opened gets it back on close —
|
|
43
|
+
* captured at first render, before the autofocus effect moves focus into
|
|
44
|
+
* the input (Modal's pattern).
|
|
45
|
+
*/
|
|
46
|
+
const previouslyFocusedElementRef = useRef(typeof document !== "undefined" &&
|
|
47
|
+
document.activeElement instanceof HTMLElement
|
|
48
|
+
? document.activeElement
|
|
49
|
+
: null);
|
|
50
|
+
// Kept fresh so the mount-once document listener never calls a stale close.
|
|
51
|
+
const onCloseRef = useRef(props.onClose);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
onCloseRef.current = props.onClose;
|
|
54
|
+
}, [props.onClose]);
|
|
55
|
+
// Recently run command ids, read once when the palette opens.
|
|
56
|
+
const [recentCommandIds] = useState(() => {
|
|
57
|
+
return props.recentStorageKey
|
|
58
|
+
? readRecentCommandIds(props.recentStorageKey)
|
|
59
|
+
: [];
|
|
60
|
+
});
|
|
61
|
+
/*
|
|
62
|
+
* Callers hand us plain English literals. Run every user-facing string
|
|
63
|
+
* through the same flat-key lookup the navbar uses so localised deployments
|
|
64
|
+
* render localised chrome.
|
|
65
|
+
*/
|
|
66
|
+
const { translateString } = useTranslateValue();
|
|
67
|
+
const tx = (value) => {
|
|
68
|
+
var _a;
|
|
69
|
+
return (_a = translateString(value)) !== null && _a !== void 0 ? _a : value;
|
|
70
|
+
};
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const open = () => {
|
|
73
|
+
setHasEntered(true);
|
|
74
|
+
};
|
|
75
|
+
const frame = requestAnimationFrame(open);
|
|
76
|
+
/*
|
|
77
|
+
* A hidden or throttled tab never runs an animation frame; the timer is
|
|
78
|
+
* the safety net that skips the transition rather than the palette.
|
|
79
|
+
*/
|
|
80
|
+
const fallbackTimer = setTimeout(open, 80);
|
|
81
|
+
return () => {
|
|
82
|
+
cancelAnimationFrame(frame);
|
|
83
|
+
clearTimeout(fallbackTimer);
|
|
84
|
+
};
|
|
85
|
+
}, []);
|
|
86
|
+
// The page behind the palette must not scroll while it is open.
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
lockPageScroll();
|
|
89
|
+
return () => {
|
|
90
|
+
unlockPageScroll();
|
|
91
|
+
};
|
|
92
|
+
}, []);
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
var _a;
|
|
95
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
96
|
+
}, []);
|
|
97
|
+
/*
|
|
98
|
+
* Escape must dismiss the palette even after focus has escaped the dialog
|
|
99
|
+
* subtree (a click on the backdrop scrollbar, a programmatic blur): the
|
|
100
|
+
* React onKeyDown on the dialog root only hears keys fired inside it, so a
|
|
101
|
+
* document-level listener backs it up while the panel is mounted (Modal's
|
|
102
|
+
* pattern). No double-fire: the React handler preventDefaults AND stops
|
|
103
|
+
* propagation, so an Escape it consumed either never reaches document or
|
|
104
|
+
* arrives flagged defaultPrevented — which is also the flag any other
|
|
105
|
+
* dialog above us would set.
|
|
106
|
+
*/
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
const handleDocumentKeyDown = (event) => {
|
|
109
|
+
if (event.defaultPrevented || event.key !== "Escape") {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Flag the key consumed for listeners after us (window-level ones too).
|
|
113
|
+
event.preventDefault();
|
|
114
|
+
onCloseRef.current();
|
|
115
|
+
};
|
|
116
|
+
document.addEventListener("keydown", handleDocumentKeyDown);
|
|
117
|
+
return () => {
|
|
118
|
+
document.removeEventListener("keydown", handleDocumentKeyDown);
|
|
119
|
+
};
|
|
120
|
+
}, []);
|
|
121
|
+
// Return focus to where it was before the palette opened (Modal's pattern).
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
return () => {
|
|
124
|
+
var _a;
|
|
125
|
+
if ((_a = previouslyFocusedElementRef.current) === null || _a === void 0 ? void 0 : _a.isConnected) {
|
|
126
|
+
previouslyFocusedElementRef.current.focus();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}, []);
|
|
130
|
+
const providerSections = useProviderSearch(props.searchProviders, query);
|
|
131
|
+
const normalizedQuery = normalizePaletteQuery(query);
|
|
132
|
+
const sections = useMemo(() => {
|
|
133
|
+
const built = [];
|
|
134
|
+
const pushSection = (id, title, isPending, entries) => {
|
|
135
|
+
built.push({
|
|
136
|
+
id,
|
|
137
|
+
title,
|
|
138
|
+
isPending,
|
|
139
|
+
// flatIndex is stamped in a single pass after all sections exist.
|
|
140
|
+
entries: entries,
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
// Group commands by category, preserving first-seen order.
|
|
144
|
+
const groupByCategory = (commands) => {
|
|
145
|
+
const order = [];
|
|
146
|
+
const byCategory = new Map();
|
|
147
|
+
commands.forEach((command) => {
|
|
148
|
+
const category = command.category || "Other";
|
|
149
|
+
if (!byCategory.has(category)) {
|
|
150
|
+
byCategory.set(category, []);
|
|
151
|
+
order.push(category);
|
|
152
|
+
}
|
|
153
|
+
byCategory.get(category).push(command);
|
|
154
|
+
});
|
|
155
|
+
return order.map((category) => {
|
|
156
|
+
return { category, commands: byCategory.get(category) };
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
if (!normalizedQuery) {
|
|
160
|
+
// Browsing: "Recent" first (when we have any), then the full catalog.
|
|
161
|
+
if (recentCommandIds.length > 0) {
|
|
162
|
+
const commandById = new Map();
|
|
163
|
+
props.commands.forEach((command) => {
|
|
164
|
+
commandById.set(command.id, command);
|
|
165
|
+
});
|
|
166
|
+
const recentCommands = [];
|
|
167
|
+
recentCommandIds.forEach((commandId) => {
|
|
168
|
+
const command = commandById.get(commandId);
|
|
169
|
+
if (command) {
|
|
170
|
+
recentCommands.push(command);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
if (recentCommands.length > 0) {
|
|
174
|
+
pushSection("recent", "Recent", false, recentCommands
|
|
175
|
+
.slice(0, RECENT_COMMANDS_LIMIT)
|
|
176
|
+
/*
|
|
177
|
+
* Recents repeat commands that also sit in their category
|
|
178
|
+
* section below — prefix the entry id so option test ids and
|
|
179
|
+
* DOM ids stay unique.
|
|
180
|
+
*/
|
|
181
|
+
.map((command) => {
|
|
182
|
+
return commandToEntry(command, "recent-");
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
groupByCategory(props.commands).forEach((group) => {
|
|
187
|
+
pushSection(getPaletteSectionId(group.category), group.category, false, group.commands.map((command) => {
|
|
188
|
+
return commandToEntry(command, "");
|
|
189
|
+
}));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
/*
|
|
194
|
+
* Searching: ranked command matches grouped by category — the ranked
|
|
195
|
+
* order decides both row order within a section and which category
|
|
196
|
+
* surfaces first — then one section per async provider.
|
|
197
|
+
*/
|
|
198
|
+
const matches = filterPaletteCommands(props.commands, query);
|
|
199
|
+
groupByCategory(matches.map((match) => {
|
|
200
|
+
return match.command;
|
|
201
|
+
})).forEach((group) => {
|
|
202
|
+
pushSection(getPaletteSectionId(group.category), group.category, false, group.commands.map((command) => {
|
|
203
|
+
return commandToEntry(command, "");
|
|
204
|
+
}));
|
|
205
|
+
});
|
|
206
|
+
providerSections.forEach((providerSection) => {
|
|
207
|
+
// A provider with nothing to show (or that failed) has no section.
|
|
208
|
+
if (!providerSection.isPending &&
|
|
209
|
+
providerSection.results.length === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
pushSection(providerSection.provider.id, providerSection.provider.title, providerSection.isPending, providerSection.results.map((result) => {
|
|
213
|
+
return {
|
|
214
|
+
id: `${providerSection.provider.id}-${result.id}`,
|
|
215
|
+
title: result.title,
|
|
216
|
+
description: result.description,
|
|
217
|
+
icon: result.icon,
|
|
218
|
+
iconColor: result.iconColor,
|
|
219
|
+
shortcut: undefined,
|
|
220
|
+
recentCommandId: null,
|
|
221
|
+
onSelect: result.onSelect,
|
|
222
|
+
};
|
|
223
|
+
}));
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Stamp each entry with its index in the flattened keyboard order.
|
|
227
|
+
let flatIndex = 0;
|
|
228
|
+
built.forEach((section) => {
|
|
229
|
+
section.entries.forEach((entry) => {
|
|
230
|
+
entry.flatIndex = flatIndex;
|
|
231
|
+
flatIndex++;
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
return built;
|
|
235
|
+
}, [
|
|
236
|
+
normalizedQuery,
|
|
237
|
+
query,
|
|
238
|
+
props.commands,
|
|
239
|
+
recentCommandIds,
|
|
240
|
+
providerSections,
|
|
241
|
+
]);
|
|
242
|
+
// Flattened list in render order — the keyboard walks this.
|
|
243
|
+
const flatEntries = useMemo(() => {
|
|
244
|
+
return sections.reduce((accumulator, section) => {
|
|
245
|
+
section.entries.forEach((entry) => {
|
|
246
|
+
accumulator.push(entry);
|
|
247
|
+
});
|
|
248
|
+
return accumulator;
|
|
249
|
+
}, []);
|
|
250
|
+
}, [sections]);
|
|
251
|
+
// A new query snaps the selection back to the best match.
|
|
252
|
+
useEffect(() => {
|
|
253
|
+
setActiveIndex(0);
|
|
254
|
+
}, [query]);
|
|
255
|
+
/*
|
|
256
|
+
* Clamp the selection when async results shrink the list under it. The
|
|
257
|
+
* functional updater matters: on a query change this effect and the reset
|
|
258
|
+
* above run in the same pass, and reading activeIndex from the closure here
|
|
259
|
+
* would clobber the queued reset with a stale clamp.
|
|
260
|
+
*/
|
|
261
|
+
useEffect(() => {
|
|
262
|
+
if (flatEntries.length === 0) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
setActiveIndex((index) => {
|
|
266
|
+
return index > flatEntries.length - 1 ? flatEntries.length - 1 : index;
|
|
267
|
+
});
|
|
268
|
+
}, [flatEntries.length]);
|
|
269
|
+
// Keep the active row scrolled into view as the selection moves.
|
|
270
|
+
useEffect(() => {
|
|
271
|
+
const row = rowRefs.current[activeIndex] || null;
|
|
272
|
+
if (row && typeof row.scrollIntoView === "function") {
|
|
273
|
+
row.scrollIntoView({ block: "nearest" });
|
|
274
|
+
}
|
|
275
|
+
}, [activeIndex]);
|
|
276
|
+
const runEntry = (entry) => {
|
|
277
|
+
if (entry.recentCommandId && props.recentStorageKey) {
|
|
278
|
+
writeRecentCommandId(props.recentStorageKey, entry.recentCommandId);
|
|
279
|
+
}
|
|
280
|
+
entry.onSelect();
|
|
281
|
+
props.onClose();
|
|
282
|
+
};
|
|
283
|
+
/*
|
|
284
|
+
* One handler on the dialog root: keys fired in the input bubble here, and
|
|
285
|
+
* so do keys fired with focus anywhere else inside the palette. Every
|
|
286
|
+
* handled key calls preventDefault so listeners beneath the palette
|
|
287
|
+
* (page shortcuts, scrolling) can see the key was consumed. Escape goes
|
|
288
|
+
* one step further and also stops propagating: the topmost dialog consumes
|
|
289
|
+
* its dismiss key outright, so document/window Escape listeners underneath
|
|
290
|
+
* (the Ask AI slide-over, page-level shortcuts) never see it at all.
|
|
291
|
+
*/
|
|
292
|
+
const handleKeyDown = (event) => {
|
|
293
|
+
if (event.key === "Escape") {
|
|
294
|
+
event.preventDefault();
|
|
295
|
+
event.stopPropagation();
|
|
296
|
+
props.onClose();
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
if (flatEntries.length === 0) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (event.key === "ArrowDown") {
|
|
303
|
+
event.preventDefault();
|
|
304
|
+
setActiveIndex((index) => {
|
|
305
|
+
return (index + 1) % flatEntries.length;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
else if (event.key === "ArrowUp") {
|
|
309
|
+
event.preventDefault();
|
|
310
|
+
setActiveIndex((index) => {
|
|
311
|
+
return (index - 1 + flatEntries.length) % flatEntries.length;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
else if (event.key === "Home") {
|
|
315
|
+
event.preventDefault();
|
|
316
|
+
setActiveIndex(0);
|
|
317
|
+
}
|
|
318
|
+
else if (event.key === "End") {
|
|
319
|
+
event.preventDefault();
|
|
320
|
+
setActiveIndex(flatEntries.length - 1);
|
|
321
|
+
}
|
|
322
|
+
else if (event.key === "Enter") {
|
|
323
|
+
event.preventDefault();
|
|
324
|
+
const entry = flatEntries[activeIndex];
|
|
325
|
+
if (entry) {
|
|
326
|
+
runEntry(entry);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
/*
|
|
331
|
+
* A mousedown on non-interactive panel chrome (section headers, the hints
|
|
332
|
+
* footer, the empty state) would move focus to the body and kill arrow-key
|
|
333
|
+
* navigation. preventDefault keeps focus in the input. Interactive targets
|
|
334
|
+
* keep their default: the input (caret/selection), option rows, and the
|
|
335
|
+
* scroll container itself — a scrollbar drag starts as a mousedown on it,
|
|
336
|
+
* and preventDefault would cancel the drag.
|
|
337
|
+
*/
|
|
338
|
+
const handlePanelMouseDown = (event) => {
|
|
339
|
+
const target = event.target instanceof HTMLElement ? event.target : null;
|
|
340
|
+
if (!target) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (target.id === "command-palette-listbox") {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (target.closest('input, textarea, select, button, a, [role="option"]')) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
event.preventDefault();
|
|
350
|
+
};
|
|
351
|
+
const activeEntry = flatEntries[activeIndex];
|
|
352
|
+
/*
|
|
353
|
+
* Once the panel has settled it carries no transform at all — a lingering
|
|
354
|
+
* scale would make it the containing block for position:fixed descendants
|
|
355
|
+
* (the Modal invariant).
|
|
356
|
+
*/
|
|
357
|
+
const panelTransitionClassName = hasEntered
|
|
358
|
+
? "opacity-100"
|
|
359
|
+
: "scale-[0.98] opacity-0";
|
|
360
|
+
const resultCount = flatEntries.length;
|
|
361
|
+
return (React.createElement("div", { className: "relative z-50", role: "dialog", "aria-modal": "true", "aria-label": tx("Command palette"), "data-testid": "command-palette", onKeyDown: handleKeyDown },
|
|
362
|
+
React.createElement("div", { className: `fixed inset-0 bg-gray-500/25 backdrop-blur-sm transition-opacity duration-150 ease-out motion-reduce:transition-none ${hasEntered ? "opacity-100" : "opacity-0"}`, "data-testid": "command-palette-backdrop", "aria-hidden": "true" }),
|
|
363
|
+
React.createElement("div", { className: "fixed inset-0 z-50 overflow-y-auto", onClick: props.onClose },
|
|
364
|
+
React.createElement("div", { className: "flex min-h-full items-start justify-center p-4 sm:p-6" },
|
|
365
|
+
React.createElement("div", { className: `relative mt-[15vh] flex w-full max-w-xl flex-col overflow-hidden rounded-xl bg-white shadow-2xl ring-1 ring-black/5 transition duration-150 ease-out motion-reduce:transition-none ${panelTransitionClassName}`, "data-testid": "command-palette-panel", onClick: (event) => {
|
|
366
|
+
event.stopPropagation();
|
|
367
|
+
}, onMouseDown: handlePanelMouseDown },
|
|
368
|
+
React.createElement("div", { className: "flex items-center gap-3 border-b border-gray-100 px-4 py-3.5" },
|
|
369
|
+
React.createElement(Icon, { icon: IconProp.Search, className: "h-5 w-5 flex-shrink-0 text-gray-400" }),
|
|
370
|
+
React.createElement("input", { ref: inputRef, "data-testid": "command-palette-input", type: "text", role: "combobox", "aria-expanded": true, "aria-autocomplete": "list", "aria-controls": "command-palette-listbox", "aria-activedescendant": activeEntry
|
|
371
|
+
? `command-palette-option-${activeEntry.id}`
|
|
372
|
+
: undefined, "aria-label": tx("Search pages, actions…"), autoComplete: "off", autoCorrect: "off", autoCapitalize: "off", spellCheck: false, value: query, onChange: (event) => {
|
|
373
|
+
setQuery(event.target.value);
|
|
374
|
+
}, placeholder: tx("Search pages, actions…"), className: "flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-0" }),
|
|
375
|
+
React.createElement(KeyboardShortcut, { keys: [KeyboardKey.Mod, "K"], size: KeyboardShortcutSize.Small, className: "hidden flex-shrink-0 sm:inline-flex" })),
|
|
376
|
+
React.createElement("p", { "aria-live": "polite", "data-testid": "command-palette-result-count", className: "sr-only" },
|
|
377
|
+
resultCount,
|
|
378
|
+
" ",
|
|
379
|
+
resultCount === 1 ? tx("result") : tx("results")),
|
|
380
|
+
React.createElement("div", { id: "command-palette-listbox", role: "listbox", "aria-label": tx("Commands"), className: "max-h-[55vh] flex-1 overflow-y-auto overscroll-contain p-2" }, flatEntries.length === 0 && !hasPendingSection(sections) ? (React.createElement("div", { "data-testid": "command-palette-empty", className: "flex flex-col items-center justify-center py-14 text-center" },
|
|
381
|
+
React.createElement("div", { className: "mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-gray-50 ring-1 ring-gray-100" },
|
|
382
|
+
React.createElement(Icon, { icon: IconProp.Search, className: "h-4 w-4 text-gray-400" })),
|
|
383
|
+
React.createElement("p", { className: "text-sm font-medium text-gray-900" }, tx("No results found.")),
|
|
384
|
+
query.trim() && (React.createElement("p", { className: "mt-1 text-xs text-gray-500" },
|
|
385
|
+
"\u201C",
|
|
386
|
+
query.trim(),
|
|
387
|
+
"\u201D")))) : (sections.map((section) => {
|
|
388
|
+
return (React.createElement("div", { key: section.id, role: "group", "aria-label": section.title, "data-testid": `command-palette-section-${section.id}`, className: "mb-1 last:mb-0" },
|
|
389
|
+
React.createElement("div", { "aria-hidden": "true", className: "flex items-center gap-2 px-3 pb-1 pt-2.5" },
|
|
390
|
+
React.createElement("h3", { className: "text-xs font-semibold uppercase tracking-wider text-gray-400" }, section.title),
|
|
391
|
+
section.isPending && (React.createElement("span", { "data-testid": `command-palette-section-pending-${section.id}`, className: "animate-pulse text-[10px] font-normal normal-case tracking-normal text-gray-400" }, tx("Searching…")))),
|
|
392
|
+
section.entries.map((entry) => {
|
|
393
|
+
return (React.createElement(PaletteRow, { key: entry.id, item: {
|
|
394
|
+
id: entry.id,
|
|
395
|
+
title: entry.title,
|
|
396
|
+
description: entry.description,
|
|
397
|
+
icon: entry.icon,
|
|
398
|
+
iconColor: entry.iconColor,
|
|
399
|
+
shortcut: entry.shortcut,
|
|
400
|
+
}, query: query, isActive: entry.flatIndex === activeIndex, onActivate: () => {
|
|
401
|
+
setActiveIndex(entry.flatIndex);
|
|
402
|
+
}, onSelect: () => {
|
|
403
|
+
runEntry(entry);
|
|
404
|
+
}, setRowElement: (element) => {
|
|
405
|
+
rowRefs.current[entry.flatIndex] = element;
|
|
406
|
+
} }));
|
|
407
|
+
})));
|
|
408
|
+
}))),
|
|
409
|
+
React.createElement("div", { "data-testid": "command-palette-footer", className: "flex items-center gap-4 border-t border-gray-100 px-4 py-2" },
|
|
410
|
+
React.createElement("span", { className: "flex items-center gap-1.5 text-[11px] text-gray-400" },
|
|
411
|
+
React.createElement(KeyboardShortcut, { keys: [KeyboardKey.ArrowUp, KeyboardKey.ArrowDown], size: KeyboardShortcutSize.ExtraSmall, variant: KeyboardShortcutVariant.Ghost }),
|
|
412
|
+
tx("to navigate")),
|
|
413
|
+
React.createElement("span", { className: "flex items-center gap-1.5 text-[11px] text-gray-400" },
|
|
414
|
+
React.createElement(KeyboardShortcut, { keys: [KeyboardKey.Enter], size: KeyboardShortcutSize.ExtraSmall, variant: KeyboardShortcutVariant.Ghost }),
|
|
415
|
+
tx("to select")),
|
|
416
|
+
React.createElement("span", { className: "flex items-center gap-1.5 text-[11px] text-gray-400" },
|
|
417
|
+
React.createElement(KeyboardShortcut, { keys: [KeyboardKey.Escape], size: KeyboardShortcutSize.ExtraSmall, variant: KeyboardShortcutVariant.Ghost }),
|
|
418
|
+
tx("to close"))))))));
|
|
419
|
+
};
|
|
420
|
+
/**
|
|
421
|
+
* Generic Linear-style command palette. Knows nothing about routes or models:
|
|
422
|
+
* callers pass a static command catalog (grouped by `category`), optional
|
|
423
|
+
* async search providers for entity results, and control open state.
|
|
424
|
+
*
|
|
425
|
+
* Portals to document.body at the modal z-tier (z-50).
|
|
426
|
+
*/
|
|
427
|
+
const CommandPalette = (props) => {
|
|
428
|
+
/*
|
|
429
|
+
* No hooks in this component on purpose: the early return below would
|
|
430
|
+
* otherwise change hook order between renders. The panel handles all state
|
|
431
|
+
* and mounts fresh on every open.
|
|
432
|
+
*/
|
|
433
|
+
if (!props.isOpen) {
|
|
434
|
+
return React.createElement(React.Fragment, null);
|
|
435
|
+
}
|
|
436
|
+
return createPortal(React.createElement(CommandPalettePanel, { commands: props.commands, searchProviders: props.searchProviders || EMPTY_PROVIDERS, onClose: props.onClose, recentStorageKey: props.recentStorageKey }), document.body);
|
|
437
|
+
};
|
|
438
|
+
export default CommandPalette;
|
|
439
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../../../../UI/Components/CommandPalette/CommandPalette.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Pure, React-free filtering and ranking for the command palette. Kept out of
|
|
3
|
+
* the component so the ranking contract can be unit-tested directly and reused
|
|
4
|
+
* by anything that needs "which commands match this text, best first".
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* How a command matched the query, best match first. The palette sorts by
|
|
8
|
+
* this tier and keeps the caller's original order within a tier, so two
|
|
9
|
+
* commands whose titles both start with the query stay in catalog order.
|
|
10
|
+
*/
|
|
11
|
+
export var PaletteMatchRank;
|
|
12
|
+
(function (PaletteMatchRank) {
|
|
13
|
+
PaletteMatchRank[PaletteMatchRank["TitlePrefix"] = 0] = "TitlePrefix";
|
|
14
|
+
PaletteMatchRank[PaletteMatchRank["TitleSubstring"] = 1] = "TitleSubstring";
|
|
15
|
+
PaletteMatchRank[PaletteMatchRank["Keyword"] = 2] = "Keyword";
|
|
16
|
+
PaletteMatchRank[PaletteMatchRank["Category"] = 3] = "Category";
|
|
17
|
+
/** Query characters appear in order in the title, but not adjacently. */
|
|
18
|
+
PaletteMatchRank[PaletteMatchRank["TitleSubsequence"] = 4] = "TitleSubsequence";
|
|
19
|
+
})(PaletteMatchRank || (PaletteMatchRank = {}));
|
|
20
|
+
export const normalizePaletteQuery = (query) => {
|
|
21
|
+
return query.trim().toLowerCase();
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* True when every character of `needle` appears in `haystack` in order (not
|
|
25
|
+
* necessarily adjacent) — the "mntr" finds "Monitors" fallback. Both inputs
|
|
26
|
+
* are expected to be lowercased already.
|
|
27
|
+
*/
|
|
28
|
+
export const isSubsequenceMatch = (needle, haystack) => {
|
|
29
|
+
if (needle.length === 0) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
let needleIndex = 0;
|
|
33
|
+
for (let haystackIndex = 0; haystackIndex < haystack.length && needleIndex < needle.length; haystackIndex++) {
|
|
34
|
+
if (haystack[haystackIndex] === needle[needleIndex]) {
|
|
35
|
+
needleIndex++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return needleIndex === needle.length;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Rank one command against an already-normalized query, or null when it does
|
|
42
|
+
* not match at all.
|
|
43
|
+
*/
|
|
44
|
+
export const rankPaletteCommand = (command, normalizedQuery) => {
|
|
45
|
+
const title = command.title.toLowerCase();
|
|
46
|
+
if (title.startsWith(normalizedQuery)) {
|
|
47
|
+
return PaletteMatchRank.TitlePrefix;
|
|
48
|
+
}
|
|
49
|
+
if (title.includes(normalizedQuery)) {
|
|
50
|
+
return PaletteMatchRank.TitleSubstring;
|
|
51
|
+
}
|
|
52
|
+
const keywordMatches = (command.keywords || []).some((keyword) => {
|
|
53
|
+
return keyword.toLowerCase().includes(normalizedQuery);
|
|
54
|
+
});
|
|
55
|
+
if (keywordMatches) {
|
|
56
|
+
return PaletteMatchRank.Keyword;
|
|
57
|
+
}
|
|
58
|
+
if (command.category.toLowerCase().includes(normalizedQuery)) {
|
|
59
|
+
return PaletteMatchRank.Category;
|
|
60
|
+
}
|
|
61
|
+
if (isSubsequenceMatch(normalizedQuery, title)) {
|
|
62
|
+
return PaletteMatchRank.TitleSubsequence;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Filter commands against free text and return them best-match-first:
|
|
68
|
+
* title-prefix > title-substring > keyword > category > title-subsequence.
|
|
69
|
+
* The sort is stable — within a tier the caller's order is preserved. An
|
|
70
|
+
* empty/whitespace query matches everything in the original order.
|
|
71
|
+
*/
|
|
72
|
+
export const filterPaletteCommands = (commands, query) => {
|
|
73
|
+
const normalizedQuery = normalizePaletteQuery(query);
|
|
74
|
+
if (!normalizedQuery) {
|
|
75
|
+
return commands.map((command) => {
|
|
76
|
+
return { command, rank: PaletteMatchRank.TitlePrefix };
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const matches = [];
|
|
80
|
+
commands.forEach((command) => {
|
|
81
|
+
const rank = rankPaletteCommand(command, normalizedQuery);
|
|
82
|
+
if (rank !== null) {
|
|
83
|
+
matches.push({ command, rank });
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Array.prototype.sort is stable, so equal ranks keep catalog order.
|
|
87
|
+
return matches.sort((a, b) => {
|
|
88
|
+
return a.rank - b.rank;
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Split text into segments for <mark> highlighting: every case-insensitive
|
|
93
|
+
* occurrence of the query becomes a match segment. Subsequence-only matches
|
|
94
|
+
* produce no highlight (per-character marks read as noise).
|
|
95
|
+
*/
|
|
96
|
+
export const getHighlightSegments = (text, query) => {
|
|
97
|
+
const needle = normalizePaletteQuery(query);
|
|
98
|
+
if (!needle) {
|
|
99
|
+
return [{ text, isMatch: false }];
|
|
100
|
+
}
|
|
101
|
+
const haystack = text.toLowerCase();
|
|
102
|
+
const segments = [];
|
|
103
|
+
let cursor = 0;
|
|
104
|
+
let matchAt = haystack.indexOf(needle);
|
|
105
|
+
while (matchAt !== -1) {
|
|
106
|
+
if (matchAt > cursor) {
|
|
107
|
+
segments.push({ text: text.slice(cursor, matchAt), isMatch: false });
|
|
108
|
+
}
|
|
109
|
+
segments.push({
|
|
110
|
+
text: text.slice(matchAt, matchAt + needle.length),
|
|
111
|
+
isMatch: true,
|
|
112
|
+
});
|
|
113
|
+
cursor = matchAt + needle.length;
|
|
114
|
+
matchAt = haystack.indexOf(needle, cursor);
|
|
115
|
+
}
|
|
116
|
+
if (cursor < text.length) {
|
|
117
|
+
segments.push({ text: text.slice(cursor), isMatch: false });
|
|
118
|
+
}
|
|
119
|
+
if (segments.length === 0) {
|
|
120
|
+
return [{ text, isMatch: false }];
|
|
121
|
+
}
|
|
122
|
+
return segments;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Stable slug for section test ids: "Analytics & Automation" →
|
|
126
|
+
* "analytics-automation". Search-provider sections use the provider's own id
|
|
127
|
+
* instead of this.
|
|
128
|
+
*/
|
|
129
|
+
export const getPaletteSectionId = (title) => {
|
|
130
|
+
return title
|
|
131
|
+
.toLowerCase()
|
|
132
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
133
|
+
.replace(/^-+|-+$/g, "");
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=PaletteFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaletteFilter.js","sourceRoot":"","sources":["../../../../../UI/Components/CommandPalette/PaletteFilter.ts"],"names":[],"mappings":"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"}
|