@oneuptime/common 12.0.34 → 13.0.0
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/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Server/EnvironmentConfig.ts +47 -16
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/MonitorTemplateService.ts +140 -19
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +349 -41
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +10 -1
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +202 -37
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +224 -10
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +40 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +16 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/esbuild-config.js +6 -0
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +44 -12
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +270 -37
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +10 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +166 -35
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +13 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState, } from "react";
|
|
2
|
+
import { DashboardVariableType, } from "../../../Types/Dashboard/DashboardVariable";
|
|
3
|
+
const MultiSelectPopover = ({ options, selected, label, isLoading, maxSelections, unavailableLabel, onChange, }) => {
|
|
4
|
+
var _a;
|
|
5
|
+
const [open, setOpen] = useState(false);
|
|
6
|
+
const wrapRef = useRef(null);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (!open) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const onDocClick = (e) => {
|
|
12
|
+
if (wrapRef.current && !wrapRef.current.contains(e.target)) {
|
|
13
|
+
setOpen(false);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
document.addEventListener("mousedown", onDocClick);
|
|
17
|
+
return () => {
|
|
18
|
+
document.removeEventListener("mousedown", onDocClick);
|
|
19
|
+
};
|
|
20
|
+
}, [open]);
|
|
21
|
+
const buttonText = selected.length === 0
|
|
22
|
+
? isLoading
|
|
23
|
+
? "Loading…"
|
|
24
|
+
: "All"
|
|
25
|
+
: selected.length === 1
|
|
26
|
+
? ((_a = options.find((option) => {
|
|
27
|
+
return option.value === selected[0];
|
|
28
|
+
})) === null || _a === void 0 ? void 0 : _a.label) ||
|
|
29
|
+
unavailableLabel ||
|
|
30
|
+
selected[0]
|
|
31
|
+
: `${selected.length} selected`;
|
|
32
|
+
const toggle = (value) => {
|
|
33
|
+
if (selected.includes(value)) {
|
|
34
|
+
onChange(selected.filter((v) => {
|
|
35
|
+
return v !== value;
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
onChange([...selected, value]);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
return (React.createElement("div", { className: "relative", ref: wrapRef },
|
|
43
|
+
React.createElement("button", { type: "button", className: "text-xs border border-gray-200 rounded-md px-2.5 py-1.5 bg-white text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-100 focus:border-blue-300 transition-colors flex items-center gap-1", disabled: isLoading, onClick: () => {
|
|
44
|
+
setOpen(!open);
|
|
45
|
+
}, title: label, "aria-label": `${label}: ${buttonText}`, "aria-expanded": open },
|
|
46
|
+
React.createElement("span", { className: "truncate max-w-[10rem]" }, buttonText),
|
|
47
|
+
React.createElement("span", { className: "text-gray-400" }, "\u25BE")),
|
|
48
|
+
open && (React.createElement("div", { className: "absolute z-30 mt-1 right-0 w-56 max-h-72 overflow-auto rounded-md border border-gray-200 bg-white shadow-lg py-1" },
|
|
49
|
+
React.createElement("div", { className: "flex items-center justify-between px-3 py-1.5 border-b border-gray-100 text-[11px] text-gray-500" },
|
|
50
|
+
React.createElement("span", null,
|
|
51
|
+
selected.length,
|
|
52
|
+
" selected"),
|
|
53
|
+
React.createElement("button", { type: "button", className: "text-blue-600 hover:underline disabled:text-gray-300", disabled: selected.length === 0, onClick: () => {
|
|
54
|
+
onChange([]);
|
|
55
|
+
} }, "Clear")),
|
|
56
|
+
maxSelections !== undefined && selected.length >= maxSelections && (React.createElement("p", { className: "px-3 py-1 text-xs text-gray-500" },
|
|
57
|
+
"Choose up to ",
|
|
58
|
+
maxSelections,
|
|
59
|
+
" labels.")),
|
|
60
|
+
options.length === 0 ? (React.createElement("div", { className: "px-3 py-2 text-xs text-gray-400" }, isLoading ? "Loading options…" : "No options available")) : (options.map((option) => {
|
|
61
|
+
const checked = selected.includes(option.value);
|
|
62
|
+
return (React.createElement("label", { key: option.value, className: "flex items-center gap-2 px-3 py-1.5 text-xs text-gray-700 hover:bg-gray-50 cursor-pointer" },
|
|
63
|
+
React.createElement("input", { type: "checkbox", className: "h-3.5 w-3.5", checked: checked, disabled: !checked &&
|
|
64
|
+
maxSelections !== undefined &&
|
|
65
|
+
selected.length >= maxSelections, onChange: () => {
|
|
66
|
+
toggle(option.value);
|
|
67
|
+
} }),
|
|
68
|
+
React.createElement("span", { className: "truncate" }, option.label)));
|
|
69
|
+
}))))));
|
|
70
|
+
};
|
|
71
|
+
const DashboardVariableControl = (props) => {
|
|
72
|
+
var _a, _b, _c, _d, _e, _f;
|
|
73
|
+
const { variable } = props;
|
|
74
|
+
const isTelemetryAttribute = variable.type === DashboardVariableType.TelemetryAttribute;
|
|
75
|
+
const isCustomList = variable.type === DashboardVariableType.CustomList ||
|
|
76
|
+
Boolean(variable.customListValues);
|
|
77
|
+
const customListOptions = variable.customListValues
|
|
78
|
+
? variable.customListValues.split(",").map((v) => {
|
|
79
|
+
return v.trim();
|
|
80
|
+
})
|
|
81
|
+
: [];
|
|
82
|
+
const isProjectLabel = variable.type === DashboardVariableType.ProjectLabel;
|
|
83
|
+
const options = isProjectLabel
|
|
84
|
+
? variable.labelOptions || []
|
|
85
|
+
: (isTelemetryAttribute
|
|
86
|
+
? props.dynamicOptions || []
|
|
87
|
+
: customListOptions).map((value) => {
|
|
88
|
+
return { label: value, value };
|
|
89
|
+
});
|
|
90
|
+
const selectedValue = (_b = (_a = variable.selectedValue) !== null && _a !== void 0 ? _a : variable.defaultValue) !== null && _b !== void 0 ? _b : "";
|
|
91
|
+
const isUnavailableSelection = Boolean(isProjectLabel &&
|
|
92
|
+
selectedValue &&
|
|
93
|
+
!options.some((option) => {
|
|
94
|
+
return option.value === selectedValue;
|
|
95
|
+
}));
|
|
96
|
+
const useSelect = isTelemetryAttribute || isCustomList || isProjectLabel;
|
|
97
|
+
const label = variable.label || variable.name;
|
|
98
|
+
return (React.createElement("div", { className: "flex items-center gap-1.5" },
|
|
99
|
+
React.createElement("label", { className: "text-xs font-medium text-gray-400 uppercase tracking-wide" }, label),
|
|
100
|
+
useSelect && variable.isMultiSelect ? (
|
|
101
|
+
/*
|
|
102
|
+
* `selectedValues` only — never defaultValue. The popover renders
|
|
103
|
+
* "All" for an empty list, and DashboardVariableInterpolation
|
|
104
|
+
* resolves an empty list to no predicate, so the two agree. Seeding
|
|
105
|
+
* this from defaultValue would put a filter behind a control that
|
|
106
|
+
* reads "All".
|
|
107
|
+
*/
|
|
108
|
+
React.createElement(MultiSelectPopover, { options: options, selected: variable.selectedValues || [], label: label, isLoading: Boolean(props.isLoadingOptions), maxSelections: isProjectLabel ? 100 : undefined, unavailableLabel: isProjectLabel ? "Unavailable label" : undefined, onChange: (next) => {
|
|
109
|
+
props.onVariableValueChange(variable.id, { selectedValues: next });
|
|
110
|
+
} })) : useSelect ? (React.createElement("select", { "aria-label": label, className: "text-xs border border-gray-200 rounded-md px-2.5 py-1.5 bg-white text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-100 focus:border-blue-300 transition-colors",
|
|
111
|
+
/*
|
|
112
|
+
* `??`, not `||`: picking "All" stores selectedValue as "", which is
|
|
113
|
+
* a real selection and must not collapse back to defaultValue. Only
|
|
114
|
+
* an unset (undefined) selection falls through to the default — the
|
|
115
|
+
* same rule the query side applies in
|
|
116
|
+
* Common/Utils/Dashboard/VariableInterpolation.ts, so what the
|
|
117
|
+
* toolbar shows and what the widgets are filtered by stay in step.
|
|
118
|
+
*/
|
|
119
|
+
value: (_d = (_c = variable.selectedValue) !== null && _c !== void 0 ? _c : variable.defaultValue) !== null && _d !== void 0 ? _d : "", disabled: props.isLoadingOptions, onChange: (e) => {
|
|
120
|
+
props.onVariableValueChange(variable.id, {
|
|
121
|
+
selectedValue: e.target.value,
|
|
122
|
+
});
|
|
123
|
+
} },
|
|
124
|
+
React.createElement("option", { value: "" }, props.isLoadingOptions ? "Loading…" : "All"),
|
|
125
|
+
isUnavailableSelection && (React.createElement("option", { value: selectedValue }, "Unavailable label")),
|
|
126
|
+
options.map((option) => {
|
|
127
|
+
return (React.createElement("option", { key: option.value, value: option.value }, option.label));
|
|
128
|
+
}))) : (React.createElement("input", { type: "text", "aria-label": label, className: "text-xs border border-gray-200 rounded-md px-2.5 py-1.5 bg-white text-gray-700 w-28 focus:outline-none focus:ring-2 focus:ring-blue-100 focus:border-blue-300 transition-colors",
|
|
129
|
+
// `??` so clearing the box stays cleared. See the select above.
|
|
130
|
+
value: (_f = (_e = variable.selectedValue) !== null && _e !== void 0 ? _e : variable.defaultValue) !== null && _f !== void 0 ? _f : "", placeholder: variable.name, onChange: (e) => {
|
|
131
|
+
props.onVariableValueChange(variable.id, {
|
|
132
|
+
selectedValue: e.target.value,
|
|
133
|
+
});
|
|
134
|
+
} }))));
|
|
135
|
+
};
|
|
136
|
+
export default DashboardVariableControl;
|
|
137
|
+
//# sourceMappingURL=DashboardVariableControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardVariableControl.js","sourceRoot":"","sources":["../../../../../UI/Components/Dashboard/DashboardVariableControl.tsx"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ export default class DashboardMonitorListComponentUtil extends DashboardBaseComp
|
|
|
49
49
|
const componentArguments = [];
|
|
50
50
|
componentArguments.push({
|
|
51
51
|
name: "Title",
|
|
52
|
-
description: "Header shown above the monitor list",
|
|
52
|
+
description: "Header shown above the monitor list. Use {{UNIT}} to show a dashboard variable’s selected label; configure Label Variable separately to filter monitors.",
|
|
53
53
|
required: false,
|
|
54
54
|
type: ComponentInputType.Text,
|
|
55
55
|
id: "title",
|
|
@@ -108,6 +108,14 @@ export default class DashboardMonitorListComponentUtil extends DashboardBaseComp
|
|
|
108
108
|
section: FiltersSection,
|
|
109
109
|
entityFilterModelType: EntityFilterModelType.Label,
|
|
110
110
|
});
|
|
111
|
+
componentArguments.push({
|
|
112
|
+
name: "Label Variable",
|
|
113
|
+
description: "Filter monitors using a Project Labels dashboard variable. This is combined with the fixed filters above. All removes only the variable filter.",
|
|
114
|
+
required: false,
|
|
115
|
+
type: ComponentInputType.ProjectLabelVariable,
|
|
116
|
+
id: "labelVariableId",
|
|
117
|
+
section: FiltersSection,
|
|
118
|
+
});
|
|
111
119
|
return componentArguments;
|
|
112
120
|
}
|
|
113
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardMonitorListComponent.js","sourceRoot":"","sources":["../../../../../Utils/Dashboard/Components/DashboardMonitorListComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,0BAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAGL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,gEAAgE,CAAC;AACxE,OAAO,sBAAsB,MAAM,iDAAiD,CAAC;AACrF,OAAO,EACL,iBAAiB,GAElB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,cAAc,GAA6B;IAC/C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,0CAA0C;IACvD,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,cAAc,GAA6B;IAC/C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,sCAAsC;IACnD,KAAK,EAAE,CAAC;IACR,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,SAAS,6BAA6B;IACpC,MAAM,OAAO,GACX,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAC5C,CAAC,KAAuB,EAAE,EAAE;QAC1B,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,WAAW;SACzB,CAAC;IACJ,CAAC,CACF,CAAC;IAEJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAiB,EAAE,CAAiB,EAAE,EAAE;QACpD,OAAQ,CAAC,CAAC,KAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,iCAAkC,SAAQ,0BAA0B;IAChF,MAAM,CAAU,mBAAmB;QACxC,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,kBAAkB;YACpC,aAAa,EAAE,sBAAsB,CAAC,WAAW;YACjD,qBAAqB,EAAE,CAAC;YACxB,sBAAsB,EAAE,CAAC;YACzB,mBAAmB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;YACvB,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAChC,yBAAyB,EAAE,CAAC;YAC5B,wBAAwB,EAAE,CAAC;YAC3B,SAAS,EAAE;gBACT,OAAO,EAAE,EAAE;aACZ;SACF,CAAC;IACJ,CAAC;IAEM,MAAM,CAAU,2BAA2B;QAGhD,MAAM,kBAAkB,GAEpB,EAAE,CAAC;QAEP,kBAAkB,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,OAAO;YACb,WAAW,
|
|
1
|
+
{"version":3,"file":"DashboardMonitorListComponent.js","sourceRoot":"","sources":["../../../../../Utils/Dashboard/Components/DashboardMonitorListComponent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import Includes from "../../Types/BaseDatabase/Includes";
|
|
2
|
+
import IncludesAnyOfGroups from "../../Types/BaseDatabase/IncludesAnyOfGroups";
|
|
3
|
+
import { DashboardVariableType, } from "../../Types/Dashboard/DashboardVariable";
|
|
4
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
5
|
+
import ObjectID from "../../Types/ObjectID";
|
|
6
|
+
import DashboardVariableInterpolation from "./VariableInterpolation";
|
|
7
|
+
export default class DashboardLabelVariable {
|
|
8
|
+
static getOptions(variable) {
|
|
9
|
+
const options = variable.labelOptions;
|
|
10
|
+
if (!Array.isArray(options) ||
|
|
11
|
+
options.length === 0 ||
|
|
12
|
+
options.length > 1000) {
|
|
13
|
+
throw new BadDataException("A project label variable must offer between 1 and 1000 labels.");
|
|
14
|
+
}
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
for (const option of options) {
|
|
17
|
+
if (!option ||
|
|
18
|
+
typeof option.value !== "string" ||
|
|
19
|
+
!ObjectID.isValidUUID(option.value) ||
|
|
20
|
+
typeof option.label !== "string" ||
|
|
21
|
+
option.label.trim().length === 0 ||
|
|
22
|
+
option.label.length > 1024 ||
|
|
23
|
+
seen.has(option.value)) {
|
|
24
|
+
throw new BadDataException("Project label variable choices must have unique label IDs and nonempty display names.");
|
|
25
|
+
}
|
|
26
|
+
seen.add(option.value);
|
|
27
|
+
}
|
|
28
|
+
return options;
|
|
29
|
+
}
|
|
30
|
+
static getFilter(data) {
|
|
31
|
+
const fixed = [...new Set(data.labelIds || [])];
|
|
32
|
+
if (!data.labelVariableId) {
|
|
33
|
+
return fixed.length > 0 ? new Includes(fixed) : undefined;
|
|
34
|
+
}
|
|
35
|
+
const matching = (data.variables || []).filter((variable) => {
|
|
36
|
+
return variable.id === data.labelVariableId;
|
|
37
|
+
});
|
|
38
|
+
const variable = matching[0];
|
|
39
|
+
if (matching.length !== 1 ||
|
|
40
|
+
!variable ||
|
|
41
|
+
variable.type !== DashboardVariableType.ProjectLabel) {
|
|
42
|
+
throw new BadDataException("The monitor widget's label variable is missing or is not a project label variable. Edit the widget to select a label variable.");
|
|
43
|
+
}
|
|
44
|
+
const allowed = new Set(DashboardLabelVariable.getOptions(variable).map((option) => {
|
|
45
|
+
return option.value;
|
|
46
|
+
}));
|
|
47
|
+
const resolved = DashboardVariableInterpolation.resolveValue(variable);
|
|
48
|
+
const selected = (resolved === null || resolved === void 0 ? void 0 : resolved.multi) ||
|
|
49
|
+
((resolved === null || resolved === void 0 ? void 0 : resolved.scalar) !== undefined ? [resolved.scalar] : []);
|
|
50
|
+
if (selected.length > 100 ||
|
|
51
|
+
selected.some((value) => {
|
|
52
|
+
return !allowed.has(value);
|
|
53
|
+
})) {
|
|
54
|
+
throw new BadDataException("Choose up to 100 labels offered by this dashboard variable, or select All.");
|
|
55
|
+
}
|
|
56
|
+
if (selected.length === 0) {
|
|
57
|
+
return fixed.length > 0 ? new Includes(fixed) : undefined;
|
|
58
|
+
}
|
|
59
|
+
const dynamic = [...new Set(selected)];
|
|
60
|
+
return fixed.length > 0
|
|
61
|
+
? new IncludesAnyOfGroups([fixed, dynamic])
|
|
62
|
+
: new Includes(dynamic);
|
|
63
|
+
}
|
|
64
|
+
static interpolateTitle(title, variables) {
|
|
65
|
+
if (!title || !(variables === null || variables === void 0 ? void 0 : variables.length)) {
|
|
66
|
+
return title;
|
|
67
|
+
}
|
|
68
|
+
return title.replace(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g, (placeholder, name) => {
|
|
69
|
+
const variable = variables.find((item) => {
|
|
70
|
+
return item.name === name;
|
|
71
|
+
});
|
|
72
|
+
if (!variable) {
|
|
73
|
+
return placeholder;
|
|
74
|
+
}
|
|
75
|
+
const resolved = DashboardVariableInterpolation.resolveValue(variable);
|
|
76
|
+
if (!resolved) {
|
|
77
|
+
return "All";
|
|
78
|
+
}
|
|
79
|
+
const values = resolved.multi || [
|
|
80
|
+
resolved.scalar,
|
|
81
|
+
];
|
|
82
|
+
return values
|
|
83
|
+
.map((value) => {
|
|
84
|
+
var _a, _b;
|
|
85
|
+
if (variable.type !== DashboardVariableType.ProjectLabel) {
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
return (((_b = (_a = variable.labelOptions) === null || _a === void 0 ? void 0 : _a.find((option) => {
|
|
89
|
+
return option.value === value;
|
|
90
|
+
})) === null || _b === void 0 ? void 0 : _b.label) || "Unavailable label");
|
|
91
|
+
})
|
|
92
|
+
.join(", ");
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=LabelVariable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LabelVariable.js","sourceRoot":"","sources":["../../../../Utils/Dashboard/LabelVariable.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AACzD,OAAO,mBAAmB,MAAM,8CAA8C,CAAC;AAC/E,OAA0B,EAExB,qBAAqB,GACtB,MAAM,yCAAyC,CAAC;AACjD,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AACtE,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,8BAEN,MAAM,yBAAyB,CAAC;AAQjC,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAClC,MAAM,CAAC,UAAU,CACtB,QAA2B;QAE3B,MAAM,OAAO,GACX,QAAQ,CAAC,YAAY,CAAC;QACxB,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,OAAO,CAAC,MAAM,GAAG,IAAI,EACrB,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,gEAAgE,CACjE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAgB,IAAI,GAAG,EAAU,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IACE,CAAC,MAAM;gBACP,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;gBAChC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;gBACnC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;gBAChC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAChC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI;gBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACtB,CAAC;gBACD,MAAM,IAAI,gBAAgB,CACxB,uFAAuF,CACxF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,SAAS,CACrB,IAA8B;QAE9B,MAAM,KAAK,GAAkB,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,GAA6B,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CACtE,CAAC,QAA2B,EAAE,EAAE;YAC9B,OAAO,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC;QAC9C,CAAC,CACF,CAAC;QACF,MAAM,QAAQ,GAAkC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5D,IACE,QAAQ,CAAC,MAAM,KAAK,CAAC;YACrB,CAAC,QAAQ;YACT,QAAQ,CAAC,IAAI,KAAK,qBAAqB,CAAC,YAAY,EACpD,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,gIAAgI,CACjI,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAgB,IAAI,GAAG,CAClC,sBAAsB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,GAAG,CAC7C,CAAC,MAA+B,EAAE,EAAE;YAClC,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC,CACF,CACF,CAAC;QACF,MAAM,QAAQ,GACZ,8BAA8B,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GACZ,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK;YACf,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,MAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5D,IACE,QAAQ,CAAC,MAAM,GAAG,GAAG;YACrB,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,EACF,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,CAAC;QACD,MAAM,OAAO,GAAkB,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAC5B,KAAyB,EACzB,SAA+C;QAE/C,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAA,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAClB,mCAAmC,EACnC,CAAC,WAAmB,EAAE,IAAY,EAAU,EAAE;YAC5C,MAAM,QAAQ,GAAkC,SAAS,CAAC,IAAI,CAC5D,CAAC,IAAuB,EAAE,EAAE;gBAC1B,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;YAC5B,CAAC,CACF,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,MAAM,QAAQ,GACZ,8BAA8B,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,MAAM,GAAkB,QAAQ,CAAC,KAAK,IAAI;gBAC9C,QAAQ,CAAC,MAAgB;aAC1B,CAAC;YACF,OAAO,MAAM;iBACV,GAAG,CAAC,CAAC,KAAa,EAAU,EAAE;;gBAC7B,IAAI,QAAQ,CAAC,IAAI,KAAK,qBAAqB,CAAC,YAAY,EAAE,CAAC;oBACzD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,CACL,CAAA,MAAA,MAAA,QAAQ,CAAC,YAAY,0CAAE,IAAI,CAAC,CAAC,MAA+B,EAAE,EAAE;oBAC9D,OAAO,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;gBAChC,CAAC,CAAC,0CAAE,KAAK,KAAI,mBAAmB,CACjC,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -46,11 +46,20 @@ export default class DashboardVariableUrlState {
|
|
|
46
46
|
}
|
|
47
47
|
static applyUrlToVariables(variables, fromUrl) {
|
|
48
48
|
return variables.map((variable) => {
|
|
49
|
+
var _a, _b;
|
|
49
50
|
const fromName = fromUrl[variable.name];
|
|
50
51
|
if (!fromName) {
|
|
51
52
|
return variable;
|
|
52
53
|
}
|
|
53
|
-
|
|
54
|
+
/*
|
|
55
|
+
* The URL's comma syntax cannot distinguish one multi-select choice
|
|
56
|
+
* from a scalar. Resolve that ambiguity using the saved definition.
|
|
57
|
+
*/
|
|
58
|
+
if (variable.isMultiSelect) {
|
|
59
|
+
return Object.assign(Object.assign({}, variable), { selectedValue: undefined, selectedValues: fromName.selectedValues ||
|
|
60
|
+
(fromName.selectedValue ? [fromName.selectedValue] : []) });
|
|
61
|
+
}
|
|
62
|
+
return Object.assign(Object.assign({}, variable), { selectedValue: (_a = fromName.selectedValue) !== null && _a !== void 0 ? _a : (_b = fromName.selectedValues) === null || _b === void 0 ? void 0 : _b.join(","), selectedValues: undefined });
|
|
54
63
|
});
|
|
55
64
|
}
|
|
56
65
|
/*
|
|
@@ -85,11 +94,17 @@ export default class DashboardVariableUrlState {
|
|
|
85
94
|
continue;
|
|
86
95
|
}
|
|
87
96
|
const paramKey = `${VAR_PREFIX}${name}`;
|
|
88
|
-
if (variable.
|
|
89
|
-
|
|
97
|
+
if (variable.isMultiSelect) {
|
|
98
|
+
if (Array.isArray(variable.selectedValues)) {
|
|
99
|
+
params.set(paramKey, variable.selectedValues.join(","));
|
|
100
|
+
}
|
|
90
101
|
continue;
|
|
91
102
|
}
|
|
92
|
-
|
|
103
|
+
/*
|
|
104
|
+
* Keep an explicit All as `var-name=`. Omitting it would restore the
|
|
105
|
+
* saved selection or default when this URL is reopened.
|
|
106
|
+
*/
|
|
107
|
+
if (typeof variable.selectedValue === "string") {
|
|
93
108
|
params.set(paramKey, variable.selectedValue);
|
|
94
109
|
}
|
|
95
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableUrlState.js","sourceRoot":"","sources":["../../../../Utils/Dashboard/VariableUrlState.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,GAAW,MAAM,CAAC;AAOlC,MAAM,CAAC,OAAO,OAAO,yBAAyB;IACrC,MAAM,CAAC,eAAe,CAC3B,MAAc;QAEd,MAAM,GAAG,GAAwC,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAoB,IAAI,eAAe,CACjD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAClD,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,QAAgB,EAAE,MAAc,EAAE,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAW,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAW,QAAQ,CAAC;YACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,GAAG;oBACV,cAAc,EAAE,OAAO;yBACpB,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE;wBACjB,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClB,CAAC,CAAC;yBACD,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE;wBACpB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACtB,CAAC,CAAC;iBACL,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,mBAAmB,CAC/B,SAAmC,EACnC,OAA4C;QAE5C,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAA2B,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"VariableUrlState.js","sourceRoot":"","sources":["../../../../Utils/Dashboard/VariableUrlState.ts"],"names":[],"mappings":"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"}
|
|
@@ -239,6 +239,32 @@ export default class MetricUnitUtil {
|
|
|
239
239
|
*/
|
|
240
240
|
return (value * fromDef.toCanonical) / metricDef.toCanonical;
|
|
241
241
|
}
|
|
242
|
+
/*
|
|
243
|
+
* The canonical base of the family this unit belongs to — "B" for any
|
|
244
|
+
* data unit, "sec" for any time unit, "%" for percent, "bit" for bits.
|
|
245
|
+
* Null when the unit belongs to no known family.
|
|
246
|
+
*
|
|
247
|
+
* Distinct from getCanonicalUnitValue, which answers "what should the
|
|
248
|
+
* threshold dropdown default to for this metric" and returns the unit
|
|
249
|
+
* itself for a known family member. This answers "what is the one unit
|
|
250
|
+
* every member of this family can be converted into", which is what a
|
|
251
|
+
* formatter needs before it can pick a human-readable scale: a value
|
|
252
|
+
* carrying the unit "GB" has to become bytes before a bytes ladder can
|
|
253
|
+
* decide that 2500 of them read best as "2.5 TB".
|
|
254
|
+
*/
|
|
255
|
+
static getFamilyBaseUnit(metricUnit) {
|
|
256
|
+
if (!metricUnit || !metricUnit.trim()) {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
const family = findFamily(metricUnit);
|
|
260
|
+
if (!family) {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
const base = family.find((u) => {
|
|
264
|
+
return u.toCanonical === 1;
|
|
265
|
+
});
|
|
266
|
+
return (base === null || base === void 0 ? void 0 : base.value) || null;
|
|
267
|
+
}
|
|
242
268
|
/*
|
|
243
269
|
* Convenience: does the metric unit belong to a family we can offer
|
|
244
270
|
* conversions for? When false, the UI should still render a dropdown,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetricUnitUtil.js","sourceRoot":"","sources":["../../../Utils/MetricUnitUtil.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MetricUnitUtil.js","sourceRoot":"","sources":["../../../Utils/MetricUnitUtil.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { normalizeMac } from "./EndpointAttachmentUtil";
|
|
2
|
+
/*
|
|
3
|
+
* null, undefined, "" and whitespace all read as the same "no site" key -
|
|
4
|
+
* the convention NetworkDeviceLinkRuleUtil and the topology builder use.
|
|
5
|
+
*/
|
|
6
|
+
export function siteKeyOf(siteId) {
|
|
7
|
+
return (siteId || "").trim();
|
|
8
|
+
}
|
|
9
|
+
export default class DeviceMacLearningUtil {
|
|
10
|
+
/*
|
|
11
|
+
* Which devices get which MAC. The rules, every one of them a refusal:
|
|
12
|
+
*
|
|
13
|
+
* - Only a device in the SAME site as the router that reported the
|
|
14
|
+
* binding. Every branch has a 10.0.0.5; a project-wide match would
|
|
15
|
+
* stamp one store's register with another store's MAC.
|
|
16
|
+
* - Only a device whose MAC column is EMPTY, or holds a MAC an earlier
|
|
17
|
+
* pass LEARNED that this table now contradicts. What an operator typed
|
|
18
|
+
* is theirs and is never touched. A learned value is the pass's own
|
|
19
|
+
* answer, and an ARP table is exactly the evidence that can be stale
|
|
20
|
+
* (an address re-leased the day before the register was plugged in
|
|
21
|
+
* stamps the previous holder's MAC), so the pass corrects itself when
|
|
22
|
+
* the address is later bound to a different MAC.
|
|
23
|
+
* - Only an address exactly one candidate device answers at. Two
|
|
24
|
+
* devices registered at one address is a contradiction, and a wrong
|
|
25
|
+
* MAC drawn as a cable is worse than none.
|
|
26
|
+
* - Only an address the ARP table binds to exactly one MAC. Proxy ARP
|
|
27
|
+
* and stale duplicates put two MACs behind one address; neither can
|
|
28
|
+
* be trusted.
|
|
29
|
+
*
|
|
30
|
+
* Output is sorted by device id, so a given input always plans the same
|
|
31
|
+
* writes in the same order.
|
|
32
|
+
*/
|
|
33
|
+
static planMacLearning(data) {
|
|
34
|
+
const macsByIp = new Map();
|
|
35
|
+
for (const binding of data.ipBindings) {
|
|
36
|
+
const mac = normalizeMac(binding.macAddress);
|
|
37
|
+
const ip = (binding.ipAddress || "").trim();
|
|
38
|
+
if (!mac || !ip) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const macs = macsByIp.get(ip);
|
|
42
|
+
if (macs) {
|
|
43
|
+
macs.add(mac);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
macsByIp.set(ip, new Set([mac]));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const siteKey = siteKeyOf(data.observingSiteId);
|
|
50
|
+
const devicesByIp = new Map();
|
|
51
|
+
for (const device of data.devices) {
|
|
52
|
+
const hostname = (device.hostname || "").trim();
|
|
53
|
+
if (!hostname || !macsByIp.has(hostname)) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (siteKeyOf(device.siteId) !== siteKey) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const bucket = devicesByIp.get(hostname);
|
|
60
|
+
if (bucket) {
|
|
61
|
+
bucket.push(device);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
devicesByIp.set(hostname, [device]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const plan = [];
|
|
68
|
+
for (const [ip, candidates] of devicesByIp) {
|
|
69
|
+
// Two devices at one address: neither can be the one.
|
|
70
|
+
if (candidates.length !== 1) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const macs = macsByIp.get(ip);
|
|
74
|
+
// Two MACs behind one address: neither can be trusted.
|
|
75
|
+
if (macs.size !== 1) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const device = candidates[0];
|
|
79
|
+
const learnedMac = Array.from(macs)[0];
|
|
80
|
+
const storedMac = normalizeMac(device.macAddress);
|
|
81
|
+
const hasStoredValue = (device.macAddress || "").trim().length > 0;
|
|
82
|
+
if (!hasStoredValue) {
|
|
83
|
+
plan.push({
|
|
84
|
+
deviceId: device.id,
|
|
85
|
+
macAddress: learnedMac,
|
|
86
|
+
ipAddress: ip,
|
|
87
|
+
previousMacAddress: null,
|
|
88
|
+
});
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Typed by somebody, or already what the table says: leave it.
|
|
92
|
+
if (device.isMacAddressLearned !== true || storedMac === learnedMac) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
plan.push({
|
|
96
|
+
deviceId: device.id,
|
|
97
|
+
macAddress: learnedMac,
|
|
98
|
+
ipAddress: ip,
|
|
99
|
+
/*
|
|
100
|
+
* The raw stored value, not the normalised one: the writer's
|
|
101
|
+
* compare-and-set has to match what the column actually holds.
|
|
102
|
+
*/
|
|
103
|
+
previousMacAddress: device.macAddress || null,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
plan.sort((a, b) => {
|
|
107
|
+
return a.deviceId < b.deviceId ? -1 : a.deviceId > b.deviceId ? 1 : 0;
|
|
108
|
+
});
|
|
109
|
+
return plan;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=DeviceMacLearningUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceMacLearningUtil.js","sourceRoot":"","sources":["../../../../Utils/Monitor/DeviceMacLearningUtil.ts"],"names":[],"mappings":"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"}
|